我正在撰写Rmd
报告,其中包含一些R
代码块,显然是。我的代码结构如下:
functions.R
脚本DataDependency.R
脚本,这已经为functions.R
提供了完整的这些任务analysis.R
DataDependency.R
脚本
furtheranalyis.R
采购analysis.R
,从那时起,我不必多次写一些步骤因此,我在很大程度上依赖于以嵌套方式来源文件的功能。但是,我无法在RMarkdown
中完成此操作,每次都会给我一些错误(见下文)。我太傻了还是缺少这个功能?!到目前为止所有尝试都导致错误。
我看到的有关该主题的其他问题仅包括在.Rmd
个文件中.Rmd
采购here)以及source()
和read_chunk()
之间的区别( here)。两者都不回答我的问题。
我已经尝试确保它确实是产生错误的嵌套源。所以这是一个最小的工作示例:
档案mweA.R
x = 1:10
和档案mweB.R
source("./mweA.R")
y = x * x
现在,在我的.Rmd
文件中,我只想加载文件B(如果必须的话,两者都加载),然后继续使用它:
```{r}
source("./mweB.R")
plot(y ~ x)
```
即使我这样做了:
```{r}
source("./mweA.R")
source("./mweB.R")
plot(y ~ x)
```
发生同样的错误,即:
Error in file(filename, "r", encoding = encoding) : cannot open the connection Calls: <Anonymous> ... source -> withVisible -> eval -> source -> file Execution halted
请注意,如果我执行source("./mweA.R")
或使用任何其他非依赖R
脚本,我就不会收到错误。
希望有一个(或多或少)秘密参数,你必须在块中指定解决所有这些。我真的很难使用Rmarkdown的代码块,而且我常常不清楚错误是什么。这主要是让我无法从latex
切换到RMarkdown
...
答案 0 :(得分:4)
您遇到的问题与knitr
或能够正确嵌套文档无关,而是R项目"working directory insanity"面临的产品
rmarkdown
将相对于文件目录而不是项目根目录编织文档。这会导致不同的相对路径,具体取决于文档是在项目会话还是knitr
会话中运行。
除了要点之外,this issue还显示了许多解决方法:
knitr specific :
为要评估的所有块设置根目录,而不是文档位置。
opts_knit$set(root.dir = '/Users/username/path_to_project')
一般情况:
使用rprojroot
或here
(后者是前者的包装器),它使用several criteria来确定文件的顶级目录。您无需使用RStudio项目即可实现此目的。
使用here::here
调用对另一个本地文件的任何引用,它将解析到同一位置,而不管它所调用的子目录。
source(here("functions.R"))
source(here("subdirectory", "DataDependency.R"))
source(here("subdirectory2", "furtheranalyis.R"))
这可能是一个更好的解决方案,因为它不依赖于knitr
选项。或者,您可以使用root.dir
设置rprojroot
块:
opts_knit$set(root.dir = rprojroot::find_rstudio_root_file())
如果您正在使用RStudio项目。如果不是,请使用具有指定标准的rprojroot::find_root
。