从master .R文件编织.rmd时,无法在.rmd块中查找文件源

时间:2013-11-09 19:38:26

标签: r knitr

假设我有一个名为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之后运行所有块。它有效,但感觉我采取了错误的方法。

1 个答案:

答案 0 :(得分:3)

@Yihui:也许你可以使用../使normalizePath('../')成为绝对路径。一个相对的工作目录可能令人困惑(至少在我读了太多级别的相对路径之后,我的头疼了:)。顺便说一句,当您在RStudio中编织HTML时,RStudio首先将工作目录更改为输入Rmd文件。

我:是的!仅使用opts_knit$set(root.dir=normalizePath('../'))可以从.rmd编织master.R文件并编织到html或运行.rmd内的所有块。我更新了github exampletest-b.rmd现在显示了这一点。谢谢!

相关问题