【发布时间】:2014-03-02 04:30:58
【问题描述】:
我在一个项目文件夹中工作,假设它的绝对路径是:/project。 getwd()告诉我我在这个项目文件夹中。我所有的文件读写都是相对于这个项目根目录的。 /project 有一个子文件夹/project/docs/,其中有一个 R Mardown 文件和一个 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() 很糟糕,因为它会破坏可重复性。如何在不使用 setwd() 的情况下告诉 knitr 将图形放置在我的项目子文件夹中?
【问题讨论】:
-
澄清一下:
setwd()只有在计算开始后才坏。它本质上不是邪恶的。相反,setwd()在 一切之前总是一个好 的想法。之后,您假设所有内容都与当前工作目录相关,这将使您的生活更轻松。设置knit()或knit2html()的output参数几乎总是一个坏主意。好吧,我承认这是我作为包作者的头痛。我鼓励你只用setwd("./docs/"); knit2html("report.Rmd"),你会得到report.html。 -
感谢亿辉的评论。我发现使用
opts_knit$set(base.dir = 'docs')可以解决我的问题。起初我尝试在 Rmd 文档的块选项中设置base.dir。这没有用。但是在 R 脚本knit_reports.R中设置base.dir选项确实有效并解决了我的问题:-)
标签: r knitr r-markdown