来自另一个Rmd中的Rmd文件的源代码

时间:2017-01-31 16:23:41

标签: r knitr r-markdown

我正在尝试使我的代码更加模块化:在一个脚本中加载和清理数据,在另一个脚本中进行分析,等等。如果我使用的是R脚本,那么在source上调用data_setup.R就可以了。在analysis.R内{1}},但我想记录我在Rmarkdown文档中为数据设置和分析做出的决定。所以我正在尝试编写某种source_rmd函数,这样我就可以将代码从data_setup.Rmd提取到analysis.Rmd

到目前为止我尝试了什么:

如果存在任何重复的块名称,则How to source R Markdown file like `source('myfile.r')`?的答案不起作用(因为名为setup的块在Rstudio的笔记本处理中具有特殊行为,因此存在问题)。 How to combine two RMarkdown (.Rmd) files into a single output?想要整合整个文档,而不仅仅是一个代码,还需要唯一的块名称。我已尝试按照Generate Dynamic R Markdown Blocks中的建议使用knit_expand,但我必须使用双花括号中的变量命名块,我真的想要一种方法让我的colaborators使用它变得容易同样。使用How to nest knit calls to fix duplicate chunk label errors?中建议的knit_child仍然会给我带来重复的标签错误。

1 个答案:

答案 0 :(得分:3)

进一步搜索后,我找到了解决方案。 knitr中有一个包选项,可以设置为更改处理重复块的行为,在标签后附加一个数字而不是出错。请参阅https://github.com/yihui/knitr/issues/957

要设置此选项,请使用options(knitr.duplicate.label = 'allow')

为了完整起见,我编写的函数的完整代码是

source_rmd <- function(file, local = FALSE, ...){
  options(knitr.duplicate.label = 'allow')

  tempR <- tempfile(tmpdir = ".", fileext = ".R")
  on.exit(unlink(tempR))
  knitr::purl(file, output=tempR, quiet = TRUE)

  envir <- globalenv()
  source(tempR, local = envir, ...)
}