假设我有一个名为的项目目录testknit
(我确实有,请参阅github了解 MRE),其中我有几个子目录,包括scripts
我保存的位置.R
和.rmd
文件。
在 RStudio 中,我创建了一个项目并选择了这个testknit
目录,这样当我打开项目时,工作目录是mypath/testknit
.
在里面testknit/scripts
我有一个master.R
文件。如果我想获取一个名为 的文件testsource1.R
,该文件也位于 中testknit/scripts
,我可以source("scripts/testsource1.R")
从内部运行master.R
。
library(knitr)
getwd()
# [1] "mypath/testknit"
source("scripts/testsource1.R")
到目前为止,一切都很好。
但是假设我还想编织一个.rmd
名为的文件,该文件test.rmd
位于testknit/scripts
. 我可以knit("scripts/test.rmd")
从master.R
.
我的test.rmd
文件执行以下操作:
```{r setup}
library(knitr)
opts_knit$set(root.dir='../')
```
```{r option1}
source("scripts/testsource2.R")
```
```{r option2}
source("testsource2.R")
```
由于test.rmd
存在于 中testknit/scripts
,因此我在第一个块中指定opts_knit$set(root.dir='../')
,因此 knitr 知道我的根目录实际上是上一层。
当我test.rmd
在 RStudio 中打开并单击knit HTML
时,可以预见的是,该option1
块有效,而该option2
块不起作用。
但是当我尝试通过从文件中test.rmd
运行而不是从文件中编织来编织时,这两个块选项都不起作用。两者都返回一个错误,即没有该名称的文件。knit("scripts/test.rmd")
master.R
.rmd
我究竟做错了什么?为什么从 mastertestsource2.R
编织文件时R 找不到?.rmd
.R
有关可重现的示例,请参见上面的 github 链接。
更新:
正如我在下面的评论中指出的那样,我尝试wd <- getwd()
在之前添加opts_knit$set
并更改(root.dir='../')
为(root.dir=wd)
. 因此,当我从 运行knit("scripts/test.rmd")
时master.R
,option2 块运行,因为wd
我添加的设置为mypath/testknit/scripts
. 但是如果我打开.rmd
文件并运行所有块,wd
设置为根目录,mypath/testknit
并且 option1 块运行。
我需要工作目录来保持项目根目录。这对我来说似乎不是一个优雅的解决方案,但正在改变:
```{r setup}
library(knitr)
opts_knit$set(root.dir='../')
```
至
```{r setup}
library(knitr)
wd <- ifelse(basename(getwd())=="scripts",
gsub("/scripts", "", getwd()),
getwd())
opts_knit$set(root.dir=wd)
```
让我在.rmd
文件中或knit("scripts/test.rmd")
从master.R
. 它有效,但感觉就像我采取了错误的方法。