能否在不使用复制/粘贴的情况下,将一个(或2个、或3个)代码块从一个R Markdown文档复制到另一个R Markdown文档中?

4
我以前阅读过类似的问题这里, 这里这里(还有更多)。
不幸的是,那些问题提供的解决方案似乎都无法解决我的问题。
我尝试了@bryanshalloway这里编写的函数,但没有得到期望的结果。
更多背景信息:我使用R Markdown工作流生成科学手稿。我在一个笔记本上执行EDA,稍后回到另一个笔记本上编写手稿。我导入数据,整理它,创建表格,进行一些基本的可视化,并包括叙述性文本(主要为了自己)。
我随后创建了一个专门用于写作手稿的笔记本。为了使其可复制,我想在导入数据、整理和处理方面包含所有 EDA 步骤,但我不需要相应的评论。此外,我可能需要一些(但绝对不是全部)我在 EDA 过程中创建的表格和基本可视化,但我需要大量完善它们以达到出版要求。

我的当前工作流程只是复制并粘贴相关代码块,然后在其中添加表格和图形(例如,在 ggplot 中添加标签和标题)。

是否有办法从一个 R Markdown 文件/R 笔记本中“源”这些单独的代码块到另一个文件?也许使用 knit_child(但不是将整个 R Markdown 文件带入当前父文件)?

我想避免将所需的代码块复制到单独的 R 脚本中。

谢谢!


嗨,这应该很简单,使用knitr::purl()函数,然后将其粘贴到rmd中(基本上创建一个反向purl函数)(它的spin())。 - user12256545
为什么不用一个独立的Rmd文件来分享代码块,并使用child=file/path/RMd选项呢? - rawr
1个回答

2

通过 knitr purl 和 spin,很可能实现以下内容:

假设这是您的初始 Rmarkdown 报告:

请将文件命名为 report1.Rmd

    ---
    title: Use `purl()` to extract R code
    ---
    
    The function `knitr::purl()` extracts R code chunks from
    a **knitr** document and save the code to an R script.
    
    Below is a simple chunk:
    
    ```{r, simple, echo=TRUE}
    1 + 1
    ```
    
    Inline R expressions like `r 2 * pi` are ignored by default.
    
    If you do not want certain code chunks to be extracted,
    you can set the chunk option `purl = FALSE`, e.g., 
    
    ```{r, ignored, purl=FALSE}
    x = rnorm(1000)
    ```

然后您需要进入控制台并下载该文件:

> knitr::purl("report1.Rmd")

这将在您所在的同一目录中创建一个名为report1.R的R文件,其中只包含不是purl=false的代码块。 它是一个简单的R脚本,看起来像这样:

## ---- simple, echo=TRUE----------------------------------------------------------------------------
1 + 1


为了安全起见,让我们重命名文件:

> file.rename("report1.R", "report_new.R")

最后让我们回到report_new.Rmd:

> knitr::spin("report_new.R", format = "Rmd", knit=F)

这将为您创建一个新的Rmd文件,名为report_new.Rmd,其中只包含相关代码块,没有其他内容。
    ```{r simple, echo=TRUE}
    1 + 1 
    ```

源代码:purl: https://bookdown.org/yihui/rmarkdown-cookbook/purl.html 自旋:https://bookdown.org/yihui/rmarkdown-cookbook/spin.html - user12256545

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