从master.R文件编织.rmd时,在.rmd块中查找文件源时出现问题
假设我有一个名为从master.R文件编织.rmd时,在.rmd块中查找文件源时出现问题,r,knitr,R,Knitr,假设我有一个名为testknit的项目目录(我有,请参见MRE),在这个目录中我有几个子目录,包括scripts,其中保存了.R和.rmd文件 在RStudio中,我创建了一个项目,并选择了这个testknit目录,这样当我打开项目时,工作目录就是mypath/testknit 在testknit/scripts内部,我有一个master.R文件。如果我想获得一个名为testsource1.R的文件,它也在testknit/scripts中,我可以从master.R中运行source(“scri
testknit
的项目目录(我有,请参见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
的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\u knit$set(root.dir='../')
,以便knitr知道我的根目录实际上是上一级的
当我在RStudio中打开test.rmd
并单击knit HTML
时,可以预见,option1
块起作用,option2
块不起作用
但是当我试图通过从master.R
运行knit(“scripts/test.rmd”)
而不是从.rmd
文件中编织test.rmd
时,两个块选项都不起作用。两者都返回一个错误,即没有该名称的文件
我做错了什么?从主.R
编织.rmd
文件时,为什么R找不到testsource2.R
有关可复制的示例,请参见上面的github链接
更新:
正如我在下面的评论中所指出的,我尝试添加
wd@Yihui:也许你可以使用normalizePath('../')
创建一个绝对路径。一个相对工作目录可能会让人感到困惑(至少在我读了太多级别的相对路径之后,我的头会痛:)。顺便说一句,在RStudio中编织HTML时,RStudio首先将工作目录更改为输入Rmd文件
我:是的!只需使用opts_knit$set(root.dir=normalizePath('../')
即可从master.R
编织.rmd
文件,并编织为html或运行.rmd
中的所有块。我更新了<代码>test-b.rmd
现在显示了这一点。谢谢 不知道,但是为什么不通过在每个块中添加getwd()
调用来进一步插入.rmd
文件?@BenBolker,我添加了wd,也许您可以使用normalizePath('../')
创建一个绝对路径。一个相对工作目录可能会让人感到困惑(至少在我读了太多级别的相对路径之后,我的头会痛:)。顺便说一句,在RStudio中编织HTML时,RStudio首先将工作目录更改为输入Rmd文件。没问题。只要让我知道这个黑暗中的盲目射击是否有效:)是的!只需使用opts_knit$set(root.dir=normalizePath('../')
即可从master.R
编织.rmd
文件,并编织为html或运行.rmd
中的所有块。我更新了github示例<代码>test-b.rmd
现在显示了这一点。谢谢如果你创建了一个答案,我会选择它。
```{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)
```