Rmarkdown 文档中的源嵌套 R 文件
Source nested R files within Rmarkdown document
我正在写一份 Rmd
报告,其中包含一些 R
代码块,显然 。我的代码结构如下:
- 自定义函数的
functions.R
脚本
DataDependency.R
用于加载包和我的数据的脚本,这已经为这些任务提供了 functions.R
- 一些
analysis.R
脚本来源 DataDependency.R
- 更多
furtheranalyis.R
采购 analysis.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
。
我正在写一份 Rmd
报告,其中包含一些 R
代码块,显然 。我的代码结构如下:
- 自定义函数的
functions.R
脚本 DataDependency.R
用于加载包和我的数据的脚本,这已经为这些任务提供了functions.R
- 一些
analysis.R
脚本来源DataDependency.R
- 更多
furtheranalyis.R
采购analysis.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
。