Rmarkdown文档中的源嵌套R文件

bam*_*phe 5 r knitr r-markdown

明显,我正在编写Rmd带有一些R代码块的报告。我的代码结构如下:

  • functions.R自定义功能的脚本
  • DataDependency.R用于加载软件包和我的数据的脚本,这已经functions.R正是这些任务的来源
  • 一些analysis.R脚本采购DataDependency.R
  • 更多furtheranalyis.R采购analysis.R,从那时起,我不必多次编写一些步骤

因此,我在很大程度上取决于以嵌套方式获取文件的功能。但是,我无法做到这一点,RMarkdown每次都会给我带来错误(请参阅下文)。我太傻了还是缺少此功能?到目前为止,所有尝试均导致错误。

我看到关于该主题的其他问题,只包括采购的.Rmd内部.Rmd文件(这里)之间的区别source(),并read_chunk()在这里)。两者都没有回答我的问题。

我已经尝试确保产生错误的确实是嵌套资源。因此,这是一个最小的工作示例:

微机

文件 mweA.R

x = 1:10
Run Code Online (Sandbox Code Playgroud)

和文件 mweB.R

source("./mweA.R")
y = x * x
Run Code Online (Sandbox Code Playgroud)

现在,在我的.Rmd文件中,我只想加载文件B(或者必须加载两个文件),然后继续:

```{r}
source("./mweB.R")
plot(y ~ x)
```
Run Code Online (Sandbox Code Playgroud)

即使我这样做:

```{r}
source("./mweA.R")
source("./mweB.R")
plot(y ~ x)
```
Run Code Online (Sandbox Code Playgroud)

发生相同的错误,即:

Error in file(filename, "r", encoding = encoding) : cannot open the connection Calls: <Anonymous> ... source -> withVisible -> eval -> source -> file Execution halted
Run Code Online (Sandbox Code Playgroud)

请注意,如果我只是执行source("./mweA.R")或获取任何其他非依赖R脚本,则不会出错。

希望在解决所有这些问题的块中必须指定一个(或多或少)秘密参数。我对Rmarkdown的代码块确实很困难,而且对我来说,常常不清楚错误是什么。这主要是阻止我从切换latexRMarkdown...

rua*_*dhw 5

你面对的不相关的问题,knitr或者能够正确地嵌套的文件,但不是R项目的产物“工作目录疯狂”一个面孔作为 rmarkdown意志相对于文档针织文件目录而不是在项目的根。根据文档是在项目会话中运行还是在会话中,这导致不同的相对路径knitr

除了要点之外,此问题还显示了许多解决方法:

针织物特定

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

opts_knit$set(root.dir = '/Users/username/path_to_project')
Run Code Online (Sandbox Code Playgroud)

一般情况

使用rprojroothere(后者是前者的包装),后者使用多个条件来确定文件的顶级目录。您无需使用RStudio项目即可工作。

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

source(here("functions.R"))
source(here("subdirectory", "DataDependency.R"))
source(here("subdirectory2", "furtheranalyis.R"))
Run Code Online (Sandbox Code Playgroud)

这可能是更好的解决方案,因为它不依赖knitr选项。或者,您可以root.dir使用rprojroot以下命令设置块:

opts_knit$set(root.dir = rprojroot::find_rstudio_root_file())
Run Code Online (Sandbox Code Playgroud)

如果您正在使用RStudio项目。如果不是,请使用rprojroot::find_root指定的条件。