【问题标题】:Source code from Rmd file within another Rmd来自另一个 Rmd 中的 Rmd 文件的源代码
【发布时间】:2017-06-17 04:13:41
【问题描述】:

我正在尝试使我的代码更加模块化:在一个脚本中加载和清理数据,在另一个脚本中进行分析等。如果我使用的是 R 脚本,这将是一个简单的问题,即在 data_setup.R 上调用 sourceanalysis.R 内部,但我想在 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,但是我必须用双花括号中的变量命名块,而且我真的很想有一种方法让我的合作者也能轻松使用它。并且按照How to nest knit calls to fix duplicate chunk label errors? 中的建议使用knit_child 仍然会给我重复标签错误。

【问题讨论】:

  • 避免重复标签错误的一个技巧就是不使用标签。这是人们在使用子文档时通常会做的事情。
  • @BrandonBertelsen 调整我的工作流程对 me 来说不是什么大问题,但我也在尝试向我的合作者提供这个功能来实现它他们也很容易用更好的工作流程进行编码。因此,理想情况下,我正在寻找某种方法来使其对某人可能对 Rmd 文档所做的各种事情具有鲁棒性。如果我让它太难使用,我担心人们根本不会分离他们的文件。 (此外,R 笔记本对名为 setup 的块的处理方式不同,所以当它独立运行时,我会在我编写的每个文档中都需要其中一个)。
  • 我不知道解决方法。我自己也有同样的问题。我通常会留下没有 YAML 标头和块标签的子文档。也许这是您将其组合在一起的过程的一部分(剥离块标签和 YAML)。如果能够让子文档自己也完全可复制,那就太好了。
  • @BrandonBertelsen 事实证明,Yuhui 添加了处理重复块标签的能力作为一个选项,这绕过了许多这些解决方案的主要问题。

标签: r knitr r-markdown


【解决方案1】:

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

【讨论】:

  • 这非常有用。
  • 我在这里发布了一个带有相关版本的要点,但它允许按标签指定块:gist.github.com/brshallo/e963b9dca5e4e1ab12ec6348b135362e
  • 一个很好的变化/补充是能够限制读取 RMD 文档特定块的调用。例如我有一个包含 5 个块的笔记本,但我只想在我调用它的脚本中运行块 1 和 3。
猜你喜欢
  • 1970-01-01
  • 2016-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-30
  • 1970-01-01
  • 2019-09-15
相关资源
最近更新 更多