假设我有一个名为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
的{{1}}文件,该文件位于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
,因此knitr知道我的根目录实际上是一个级别。
当我在RStudio中打开opts_knit$set(root.dir='../')
并点击test.rmd
时,可以预见,knit HTML
块有效,option1
块无效。
但是当我尝试通过从option2
运行test.rmd
而不是在knit("scripts/test.rmd")
文件中编织来编织master.R
时,两个块选项都不起作用。两者都返回一个错误,即该名称没有文件。
我做错了什么?在编写主.rmd
的{{1}}文件时,为什么无法找到testsource2.R
?
请参阅上面的github链接以获得可重现的示例。
更新:
正如我在评论中所述,我尝试在.rmd
之前添加.R
,并将wd <- getwd()
更改为opts_knit$set
。因此,当我从(root.dir='../')
运行(root.dir=wd)
时,option2 chunk会运行,因为我添加的knit("scripts/test.rmd")
设置为master.R
。但是,如果我打开wd
文件并运行所有块,mypath/testknit/scripts
将设置为根目录.rmd
,并且option1块运行。
我需要工作目录来保留项目根目录。这对我来说似乎不是一个优雅的解决方案,而是在改变:
wd
到
mypath/testknit
让我在```{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
之后运行所有块。它有效,但感觉我采取了错误的方法。
答案 0 :(得分:3)
../
使normalizePath('../')
成为绝对路径。一个相对的工作目录可能令人困惑(至少在我读了太多级别的相对路径之后,我的头疼了:)。顺便说一句,当您在RStudio中编织HTML时,RStudio首先将工作目录更改为输入Rmd文件。
我:是的!仅使用opts_knit$set(root.dir=normalizePath('../'))
可以从.rmd
编织master.R
文件并编织到html或运行.rmd
内的所有块。我更新了github example。 test-b.rmd
现在显示了这一点。谢谢!