如何将两个 RMarkdown (.Rmd) 文件组合成一个输出?

Posted

技术标签:

【中文标题】如何将两个 RMarkdown (.Rmd) 文件组合成一个输出?【英文标题】:How to combine two RMarkdown (.Rmd) files into a single output? 【发布时间】:2014-11-07 14:34:22 【问题描述】:

我在同一个文件夹中有两个文件:chapter1.Rmd和chapter2.Rmd,内容如下:

chapter1.Rmd

---
title: "Chapter 1"
output: pdf_document
---

## This is chapter 1. #Chapter1

Next up: [chapter 2](#Chapter2)

chapter2.Rmd

---
title: "Chapter 2"
output: pdf_document
---

## This is chapter 2. #Chapter2

Previously: [chapter 1](#Chapter1)

我怎样才能将它们编织成一个单独的 pdf 输出?

当然,render(input = "chapter1.Rmd", output_format = "pdf_document") 可以完美运行,但 render(input = "chapter1.Rmd", input = "chapter2.Rmd", output_format = "pdf_document") 不行。

我为什么要这样做?将giant document 分解为逻辑文件。

我已经使用 @hadley 的 bookdown 包从 .Rmd 构建乳胶,但这对于这个特定任务来说似乎有点过分了。是否有使用我缺少的 knitr/pandoc/linux 命令行的简单解决方案?谢谢。

【问题讨论】:

为什么不直接用 LaTeX 编写?似乎您需要的所有工具都内置在 LaTeX 中,并且编织过程无论如何都会通过 TeX 引擎运行您的文档。 是的,我喜欢乳胶并且需要将代码嵌入其中,这是一个很好的 B 计划。使用读/写函数 ATM 开发 R 解决方案,因为我相信 Markdown 是用户友好的未来! arxiv.org/abs/1402.1894 即这是一个哲学决定:成为你想在世界上看到的改变。 此外,以降价形式编写可降低参与贡献的门槛。最终会是 LaTeX,但目前 markdown 就足够了。 hadley 的 bookdown 现在正在由@yihui 开发,并且有很多进一步的工作和有用的文档:rstudio.github.io/bookdown 【参考方案1】:

这对我有用:

Rmd_bind <- 
    function(dir = ".",
    book_header = readLines(textConnection("---\ntitle: 'Title'\n---")))

    old <- setwd(dir)
    if(length(grep("book.Rmd", list.files())) > 0)
    warning("book.Rmd already exists")
    
    write(book_header, file = "book.Rmd", )
    cfiles <- list.files(pattern = "*.Rmd", )
    ttext <- NULL
    for(i in 1:length(cfiles))
    text <- readLines(cfiles[i])
    hspan <- grep("---", text)
    text <- text[-c(hspan[1]:hspan[2])]
    write(text, sep = "\n", file = "book.Rmd", append = T)
    
    render("book.Rmd", output_format = "pdf_document")
    setwd(old)
    

想象一下有一个更好的解决方案,如果在 rmarkdown 或 knitr 包中有这样的东西会很高兴。

【讨论】:

我认为这是一个合理的解决方案,除了你忘记了几个括号(和缩进!!:)【参考方案2】:

2018 年 8 月更新:此答案是在 bookdown 出现之前编写的,这是一种编写基于 Rmarkdown 的书籍的更强大的方法。查看@Mikey-Harper 的answer 中的最小bookdown 示例!

当我想将大型报表拆分为单独的 Rmd 时,我通常会创建一个父 Rmd 并将章节包含为子级。这种方法很容易让新用户理解,而且如果您包含目录 (toc),则很容易在章节之间导航。

report.Rmd

---  
title: My Report  
output: 
  pdf_document:
    toc: yes 
---

```r child = 'chapter1.Rmd'
```

```r child = 'chapter2.Rmd'
```

第一章.Rmd

# Chapter 1

This is chapter 1.

```r
1
```

chapter2.Rmd

# Chapter 2

This is chapter 2.

```r
2
```

构建

rmarkdown::render('report.Rmd')

产生:

如果您想要一种快速的方法来为您的子文档创建块:

rmd <- list.files(pattern = '*.Rmd', recursive = T)
chunks <- paste0("```r child = '", rmd, "'\n```\n")
cat(chunks, sep = '\n')
# ```r child = 'chapter1.Rmd'
# ```
#
# ```r child = 'chapter2.Rmd'
# ```

【讨论】:

它有效,但我有 10 章。当我渲染文件时,它会上升到第 5 个文件。我可以从 PDF 导航面板看到所有标题,但没有显示页面。【参考方案3】:

我建议人们使用 bookdown 包从多个 R Markdown 文件创建报告。它添加了许多有用的功能,例如交叉引用,这对于较长的文档非常有用。

改编自 @Eric 的示例,这里是 bookdown 设置的最小示例。主要细节是主文件必须被称为index.Rmd,并且必须包含额外的YAML行site: bookdown::bookdown_site

index.Rmd

---
title: "A Minimal bookdown document"
site: bookdown::bookdown_site
output:
  bookdown::pdf_document2:
    toc: yes
---

01-intro.Rmd

# Chapter 1

This is chapter 1.

```r
1
```

02-intro.Rmd

# Chapter 2

This is chapter 2.

```r
2
```

如果我们 Knit index.Rmd bookdown 将按字母顺序合并同一目录中的所有文件(可以使用额外的 _bookdown.yml 文件更改此行为)。

一旦您熟悉了这个基本设置,就可以很容易地使用额外的配置文件(例如 _bookdown.yml_output.yml)自定义 bookdown 文档和输出格式

进一步阅读

R Markdown: The definitive Guide:第 11 章提供了一个很好的 bookdown 概述 Authoring books with bookdown 提供全面的订书指南,建议了解更高级的详细信息。

【讨论】:

可以这样渲染嵌套的 Rmd 文件吗?如何?我想为 chapter 中的每个元素设置一个 Rmd。 bookdown 通常建议每个文件包含一章。但是,如果需要,应该可以拆分为单独的文件。最简单的方法是为每个文件提供一个数字索引,例如 1-1、1-2、1-3 等。 我试图在末尾添加显示两个文档代码的附录。我怎样才能实现? 这似乎是一个截然不同的问题。您可能想打开另一个问题并提供一个完整的示例,我会尽力回答:) 澄清:Knit 仅预览当前文档,而“Build book”则构建所有文档。

以上是关于如何将两个 RMarkdown (.Rmd) 文件组合成一个输出?的主要内容,如果未能解决你的问题,请参考以下文章

注释掉 R Markdown 中的文本(Rmd 文件)

终于解决了Rstudio中Rmarkdown的.rmd文件knit为PDF

使用没有 PDF 导航按钮的 rmarkdown 渲染导出为 PDF

使用 shinyAppDir 在 Rmarkdown 中嵌入超过 1 个闪亮的应用程序

shinyApp 没有将 Rmarkdown 文件呈现为 RStudio

rmarkdown::render() 不允许同时有多个用户?