假设我有一个名为的项目目录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. 它有效,但感觉就像我采取了错误的方法。