Rmarkdown 文档中的源嵌套 R 文件

Source nested R files within Rmarkdown document

我正在写一份 Rmd 报告,其中包含一些 R 代码块,显然 。我的代码结构如下:

因此,我在很大程度上依赖于以 嵌套 方式获取源文件的功能。但是,我无法在 RMarkdown 中完成此操作,这每次都会给我错误(见下文)。是我太笨了还是缺少此功能?!到目前为止所有尝试都导致错误。

我看到的关于该主题的其他问题仅包括 .Rmd 文件 (here) and the distinction between source() and read_chunk() (here) 中的 .Rmd 来源。两者都没有回答我的问题。

我已经尝试确保确实是 嵌套来源 产生了错误。所以这是一个最小的工作示例:

MWE

文件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...

您面临的问题与 knitr 或能够正确嵌套文档无关,而是 R 项目的产物 "working directory insanity" rmarkdown 将相对于 文件目录 编织文档,而不是 项目根目录 。这会导致不同的相对路径,具体取决于文档在项目会话中是 运行 还是 knitr 会话。

除了要点之外,this issue 还显示了一些解决方法:

knitr 具体:

为所有要评估的块设置根目录,而不是文档位置。

opts_knit$set(root.dir = '/Users/username/path_to_project')

一般情况:

使用 rprojroot or here (the latter is a wrapper over the former), which uses several criteria 来确定文件的顶级目录。您无需使用 RStudio 项目即可工作。

使用 here::here 调用对另一个本地文件的任何引用,无论调用它的子目录如何,它都将解析到相同的位置。

source(here("functions.R"))
source(here("subdirectory", "DataDependency.R"))
source(here("subdirectory2", "furtheranalyis.R"))

这可能是更好的解决方案,因为它不依赖于 knitr 选项。或者,您可以使用 rprojroot:

设置 root.dir
opts_knit$set(root.dir = rprojroot::find_rstudio_root_file())

前提是您使用的是 RStudio 项目。如果不是,请使用具有指定标准的 rprojroot::find_root