knitr:如何在不使用setwd()的情况下设置knit2html中的图像路径?

9
我在一个项目文件夹中工作,假设它的绝对路径为:/projectgetwd() 告诉我我当前在这个项目文件夹中。我的所有文件读取和写入都是相对于这个项目根目录的。 /project 有一个子文件夹 /project/docs/,其中包含一个 R Markdown 文件和一个 R 脚本:

report.Rmd 包含:

```{r }
plot(cars)
```

"而且,knit_reports.R 包含以下内容:"
library(knitr)
knit2html("./docs/report.Rmd", "./docs/report.html")

如果我运行knit_reports.R,将生成一个HTML页面,但页面上不会显示图像。
问题在于图像存储在/project/figures下。它们对于HTML文档生成不可见。我正在寻找一种方法告诉knitr将图片存储在/project/docs/figures下。
report.Rmd中设置knitr选项root.dir或base.dir没有解决问题,我尝试了opts_knit$set(root.dir = "./docs")opts_knit$set(base.dir = "/project/docs")
然而,如果我将工作目录更改为/project/docs
setwd("./docs/")
knit2html("report.Rmd", "report.html")

创建一个/project/docs/figure文件夹,并在html页面上显示图像。
许多人说在脚本中使用setwd()是不好的,因为它会破坏可重复性。我该如何告诉knitr将图像放置在我的项目子文件夹中,而不使用setwd()呢?

2
只是为了澄清:setwd()仅在计算开始后才会变得糟糕。它本质上并不邪恶。相反,最好在其他所有操作之前先使用setwd()。之后,您可以假设一切都是相对于当前工作目录的,这将使您的生活更加轻松。几乎总是不明智的设置knit()knit2html()output参数。嗯,我承认这是我作为软件包作者的头疼问题。我鼓励您只需setwd("./docs/"); knit2html("report.Rmd"),然后您就可以获得report.html - Yihui Xie
感谢Yihui的评论。我发现使用opts_knit $ set(base.dir ='docs')可以解决我的问题。起初,我尝试在Rmd文档的块选项中设置“base.dir”。但是,在R脚本“knit_reports.R”中设置“base.dir”选项确实有效,并解决了我的问题:-) - Paul Rougieux
3个回答

10
请参考此页面关于代码块选项的介绍。你有两个选择:
  1. 使用fig.path将图表目录相对于工作目录设置(或者)
  2. 使用base.dir设置保存图表的绝对目录。
在你的情况下,我认为(2)可能是更好的解决方案。在knitr文档中不要使用setwd(),因为这不是保持文档可重复性的好习惯。

谢谢您的回答,我尝试了这些选项,但它们在我的情况下不起作用。我在上面提供了一个最小可重现的示例。 - Paul Rougieux

6

Ramnath的回答是关于设置base.dir的好的解决方法。但是起初,我认为这个选项应该在Rmd块中设置,但这并没有起作用。实际上,这个选项应该在R脚本中设置。我想这是一个作用域的问题。

因此,在我上面的示例中,knit_reports.R应该包含以下内容:

library(knitr)
opts_knit$set(base.dir = 'docs') # Change the base dir where to save figures
knit2html("./docs/report.Rmd", "./docs/report.html")

1
我认为将 opts_knit$set(...) 移动到 Rmd 文档中,并将其放置在第一个代码块中也可以起作用。无论如何,@yihui 的评论指出在与 Rmd 文件相同的目录中运行 knitr 是非常有用的。 - Ramnath
1
在Rmd文档中的第一个代码块中设置opts_knit$set(...)对我没有起作用。如果您设法在您的系统上尝试使用上述2个文件,请告诉我发生了什么。 - Paul Rougieux
由于某种原因,在生成文件时,.tex文档未使用正确的目录。它们都只是figure/image_filename,而不是base.dir/figure/image_filename - Max Candocia

0
我想补充一点,如果你在knit2html中指定了不同的输出目录,可能会遇到问题,因为图像文件夹保存在原始目录中。至少根据我的经验,HTML文件将不包含你的绘图。所以:如其他地方所提到的,请尽量不要更改输出目录。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接