假设我有一个项目目录,叫做"testknit"(实际上就是这个名字,可参考MRE的github), 目录下包含多个子目录,其中包括一个"scripts"目录,用于存储".R"和".rmd"文件。
在RStudio中,我创建了一个项目并选择了"testknit"目录,这样当我打开项目时,工作目录就是"mypath/testknit"。
在"testknit/scripts"目录中,我有一个"master.R"文件。如果我想要引用一个名为"testsource1.R"的文件,它也在"testknit/scripts"目录中,我可以在"master.R"文件中运行"source("scripts/testsource1.R")"。
到目前为止,一切都很好。
但是假设我还想编织一个名为
我的
自从
当我在RStudio中打开
但是,当我尝试从
我做错了什么?为什么在从主
请参见上面的github链接以获取可重现的示例。
更新:
如我在下面的评论中所述,我尝试在
我需要工作目录保持项目根目录。对我来说,这似乎不是一种优雅的解决方案,但更改:
在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
的文件,它位于 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
文件中编织时,两个选项都无法正常工作。两者都返回找不到该名称的文件的错误。我做错了什么?为什么在从主
.R
中编织.rmd
文件时R找不到testsource2.R
?请参见上面的github链接以获取可重现的示例。
更新:
如我在下面的评论中所述,我尝试在
opts_knit$set
之前添加wd <- getwd()
并将(root.dir='../')
更改为(root.dir=wd)
。因此,当我从master.R
运行knit("scripts/test.rmd")
时,由于我添加的wd
被设置为mypath/testknit/scripts
,因此选项2代码块运行。但是,如果我打开.rmd
文件并运行所有代码块,则wd
将设置为根目录mypath/testknit
,并且选项1代码块将运行。我需要工作目录保持项目根目录。对我来说,这似乎不是一种优雅的解决方案,但更改:
```{r setup}
library(knitr)
opts_knit$set(root.dir='../')
```
to
```{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
文件呢? - Ben Bolkeropts_knit$set(root.dir=wd)
之前添加了wd <- getwd()
。我不知道为什么,但现在当我从master.R
运行knit("scripts/test.rmd")
时,wd
被设置为mypath/testknit/scripts
,因此option2
块运行。但是,如果我打开.rmd
文件并运行所有块,则wd
设置为根目录mypath/testknit
,并且option1
块运行。你知道为什么从master.R
运行knit("scripts/test.rmd")
时,wd
会从mypath/testknit
更改为mypath/testknit/scripts
吗? - Eric GreennormalizePath('../')
将../
转换为绝对路径。相对工作目录可能会让人感到困惑(至少我在阅读太多级别的相对路径后会感到头痛 :)。顺便说一下,当您在 RStudio 中编织 HTML 时,RStudio 首先将工作目录更改为输入的 Rmd 文件所在目录。 - Yihui Xieopts_knit$set(root.dir=normalizePath('../'))
就可以从master.R
中编织.rmd
文件并将其编织为html或从.rmd
内运行所有块。我更新了GitHub示例。test-b.rmd
现在显示了这一点。谢谢!如果您创建一个答案,我会选择它。 - Eric Green