Rmarkdown文档

时间:2018-02-08 11:39:14

标签: r knitr r-markdown

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

  • 自定义函数的functions.R脚本
  • 用于加载软件包和我的数据的
  • DataDependency.R脚本,这已经为functions.R提供了完整的这些任务
  • 采购analysis.R
  • 的一些DataDependency.R脚本
  • 更多furtheranalyis.R采购analysis.R,从那时起,我不必多次写一些步骤

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

我看到的有关该主题的其他问题仅包括在.Rmd个文件中.Rmd采购here)以及source()read_chunk()之间的区别( here)。两者都不回答我的问题。

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

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

1 个答案:

答案 0 :(得分:4)

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

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

knitr specific

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

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

一般情况

使用rprojroothere(后者是前者的包装器),它使用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