knitr:如何在不使用setwd()的情况下在knit2html中设置地物路径?
我在一个项目文件夹中工作,假设它的绝对路径是:knitr:如何在不使用setwd()的情况下在knit2html中设置地物路径?,r,knitr,r-markdown,R,Knitr,R Markdown,我在一个项目文件夹中工作,假设它的绝对路径是:/projectgetwd()告诉我我在这个项目文件夹中。我的所有文件读取和写入都与此项目根相关/project有一个子文件夹/project/docs/,其中有一个R Mardown文件和一个R脚本: 报告。Rmd包含: ```{r } plot(cars) ``` library(knitr) knit2html("./docs/report.Rmd", "./docs/report.html") 和knit\u报告。R包含: ```{r }
/project
getwd()
告诉我我在这个项目文件夹中。我的所有文件读取和写入都与此项目根相关/project
有一个子文件夹/project/docs/
,其中有一个R Mardown文件和一个R脚本:
报告。Rmd
包含:
```{r }
plot(cars)
```
library(knitr)
knit2html("./docs/report.Rmd", "./docs/report.html")
和knit\u报告。R
包含:
```{r }
plot(cars)
```
library(knitr)
knit2html("./docs/report.Rmd", "./docs/report.html")
如果运行
knit_reports.R
,将生成一个html页面,但页面上不会显示图形
问题是图形存储在/project/figures
下。它们在生成html文档时不可见。我正在寻找一种方法,告诉knitr将图片存储在/project/docs/figures
下
在report.Rmd中设置knitr options root.dir或base.dir无法解决问题,我尝试了选择knit$set(root.dir=“./docs”)
或选择knit$set(base.dir=“/project/docs”)
但是,如果我将工作目录更改为/project/docs
:
setwd("./docs/")
knit2html("report.Rmd", "report.html")
将创建一个/project/docs/figure
文件夹,图形将显示在html页面上
许多人说在脚本中使用setwd()是不好的,因为它会破坏再现性。我如何告诉knitr在不使用setwd()的情况下将图形放置在我的项目子文件夹中?看看这个。特别是,您有两个选择
使用fig.path
设置相对于工作目录的绘图目录(或)
使用base.dir
设置保存绘图的绝对目录
我认为(2)在您的环境中可能是更好的解决方案。不要在knitr
文档中使用setwd()
,因为这不是保持文档可复制性的好做法。Ramnath对set 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")
我想补充一点,如果在knit2html中指定不同的输出目录,您可能会遇到问题,因为figure文件夹保存到原始目录中。那么,至少根据我的经验,html文件将不包含您的绘图。所以:正如其他地方提到的。尽量不要更改输出目录谢谢您的回答,我尝试了这些选项,但它们在我的情况下不起作用。我在上面给出了一个最小的可重复的例子。只是为了澄清:setwd()
只有在计算开始后才是坏的。它并非天生邪恶。相反,最好先setwd()
。之后,您假设所有内容都与当前工作目录相关,这将使您的生活更加轻松。设置knit()
或knit2html()
的output
参数几乎总是一个坏主意。嗯,我承认这是我作为软件包作者的头痛。我鼓励您只需setwd(“./docs/”);knit2html(“report.Rmd”)
,您将获得report.html
。感谢易慧的评论。我发现使用opts\u knit$set(base.dir='docs')
可以解决我的问题。起初,我尝试在Rmd文档的块选项中设置base.dir
。这不管用。但是在R脚本knit_reports.R
中设置base.dir
选项确实有效,并解决了我的问题:-)我认为在Rmd文档中移动opts_knit$set(…)
并将其放置在第一个代码块中也应该有效。在任何情况下,@yihui在Rmd文件所在的目录中运行knitr
的注释都是非常有用的。在Rmd文档的第一个代码块中设置opts_knit$set(…)对我来说不起作用。请告诉我,如果您尝试在系统上使用上述2个文件,会发生什么情况。由于某些原因,.tex文档在生成文件时没有使用正确的目录。它们都只是figure/image\u文件名
,而不是base.dir/figure/image\u文件名
。