在另一个Rmd文件中提取Rmd文件的源代码

14

我试图让我的代码更加模块化:在一个脚本中加载和清理数据,在另一个脚本中进行分析等。如果我使用R脚本,只需在analysis.R中调用data_setup.Rsource函数即可。但我想在一个Rmarkdown文档中记录我所做出的决策,包括数据设置和分析。因此,我正在尝试编写某种source_rmd函数,以便可以将data_setup.Rmd中的代码源自到analysis.Rmd中。

我尝试过的方法:

如何像“source('myfile.r')”那样源R Markdown文件?的回答无法处理重复的代码块名称(因为名称为setup的代码块在Rstudio的笔记本处理中具有特殊行为)。如何将两个RMarkdown (.Rmd)文件组合成单个输出?旨在组合整个文档,而不仅仅是来自一个文档的代码,并且需要唯一的代码块名称。我尝试了生成动态R Markdown块中建议的使用knit_expand,但我必须使用双大括号中的变量来命名代码块,而且我真的希望这对我的合作者也很容易使用。使用嵌套knit调用以修复重复块标签错误中建议的knit_child仍然会给我带来重复的标签错误。


避免重复标签错误的一个技巧是简单地不使用标签。当使用子文档时,这通常是人们所做的。 - Brandon Bertelsen
@BrandonBertelsen 对于我来说,调整我的工作流程并不是太大的问题,但我也想为我的合作者提供这个功能,让他们更轻松地编写具有更好工作流程的代码。因此,理想情况下,我正在寻找一些方法,使其能够抵御可能对Rmd文档进行的各种操作。如果我让它过于复杂,我担心人们根本不会将它们分离开来。(此外,R笔记本会以不同的方式处理命名为“setup”的块,因此每个文档都需要一个这样的块,在其独立运行时运行)。 - Empiromancer
我不知道有什么解决办法。我自己也有同样的问题。我通常会将我的子文档留下没有YAML头和没有块标签。也许这是你把它们组合在一起的过程的一部分(去除块标签和YAML)。如果子文档本身也能完全可重复,那就太好了。 - Brandon Bertelsen
正如事实所证明的那样,Yuhui添加了处理重复块标签的能力作为一个选项,这绕过了许多解决方案中的主要问题。 - Empiromancer
1个回答

17

经过进一步搜索,我找到了解决方案。在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, ...)
}

这非常有帮助。 - Daniel Yudkin
我在这里发布了一份相关版本的Gist,但它允许通过标签指定代码块:https://gist.github.com/brshallo/e963b9dca5e4e1ab12ec6348b135362e - Bryan Shalloway
一个不错的变化/补充是能够限制调用以读取RMD文档的特定块。例如,我有一个笔记本包含5个块,但我只想在调用它的脚本中运行第1和第3块。 - Brisbane Pom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接