【发布时间】:2013-11-09 19:38:26
【问题描述】:
假设我有一个名为 testknit 的项目目录(我确实有,请参阅 github 了解 MRE),在其中我有几个子目录,包括 scripts 我在其中保存 .R 和 .rmd 文件.
在 RStudio 中,我创建了一个项目并选择了这个testknit 目录,这样当我打开项目时,工作目录就是mypath/testknit。
在testknit/scripts 内部,我有一个master.R 文件。如果我想获取一个名为testsource1.R 的文件,它也在testknit/scripts 中,我可以在master.R 中运行source("scripts/testsource1.R")。
library(knitr)
getwd()
# [1] "mypath/testknit"
source("scripts/testsource1.R")
到目前为止一切顺利。
但是假设我还想编织一个名为test.rmd 的.rmd 文件,该文件位于testknit/scripts 中。我可以从master.R 运行knit("scripts/test.rmd")。
我的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 知道我的根目录实际上是上一层。
当我在 RStudio 中打开 test.rmd 并单击 knit HTML 时,可以预见的是,option1 块有效,而 option2 块无效。
但是当我尝试通过从master.R 运行knit("scripts/test.rmd") 而不是从.rmd 文件中编织来编织test.rmd 时,块选项都不起作用。两者都返回没有同名文件的错误。
我做错了什么?为什么R在从主.R编织.rmd文件时找不到testsource2.R?
有关可重现的示例,请参见上面的 github 链接。
更新:
正如我在下面的 cmets 中所指出的,我尝试在 opts_knit$set 之前添加 wd <- getwd() 并将 (root.dir='../') 更改为 (root.dir=wd)。所以当我从master.R 运行knit("scripts/test.rmd") 时,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 文件或master.R 中的knit("scripts/test.rmd") 中运行所有块。它有效,但感觉我采取了错误的方法。
【问题讨论】:
-
不知道,但你为什么不通过在每个块中添加
getwd()调用来进一步检测你的.rmd文件? -
@BenBolker,我在
opts_knit$set(root.dir=wd)之前添加了wd <- getwd()。我不明白为什么,但现在当我从master.R运行knit("scripts/test.rmd")时,option2 块运行,因为我添加的wd设置为mypath/testknit/scripts。但是如果我打开.rmd文件并运行所有块,wd被设置为根目录mypath/testknit,并且 option1 块运行。你知道为什么wd从master.R运行knit("scripts/test.rmd")时从mypath/testknit变为mypath/testknit/scripts吗? -
也许您可以使用
normalizePath('../')使../成为绝对路径。相对工作目录可能会令人困惑(至少在我阅读了太多级别的相对路径后我的头疼:)。顺便说一句,当您在 RStudio 中编写 HTML 时,RStudio 首先将工作目录更改为输入 Rmd 文件。 -
没问题。只要让我知道这个在黑暗中的盲目射击是否有效:)
-
是的!仅使用
opts_knit$set(root.dir=normalizePath('../'))可用于从master.R编织.rmd文件并编织为html 或从.rmd中运行所有块。我更新了 github 示例。test-b.rmd现在显示这个。谢谢!如果您创建答案,我会选择它。