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


99

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

第1章

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

## This is chapter 1. {#Chapter1}

Next up: [chapter 2](#Chapter2)

第2章

---
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")不能。

我为什么要这样做?将巨大的文档分解为逻辑文件。

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


1
为什么不只是在LaTeX中原生编写?看来您所需的所有工具都内置在LaTeX中,并且编织过程始终通过TeX引擎运行您的文档。
托马斯

13
是的,我喜欢乳胶,因此需要将代码嵌入其中。所以这是一个不错的计划B。使用具有read / writeLines函数ATM的R解决方案,因为我相信Markdown是用户友好的未来!arxiv.org/abs/1402.1894也就是说,这是一个哲学决定:成为您想在世界上看到的变化。
RobinLovelace 2014年

2
同样,以降价写作可以减少贡献的门槛。最终它将是LaTeX,但暂时降价已足够。
RobinLovelace

4
哈德利的bookdown正受到@yihui开发的,已经有很多的进一步工作和有用的文档:rstudio.github.io/bookdown

Answers:


136

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

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

报告

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

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

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

第1章

# Chapter 1

This is chapter 1.

```{r}
1
```

第2章

# 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导航面板中看到所有标题,但未显示页面。
Suat Atan PhD 2015年

26

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

改编@Eric中的示例,这是书本设置的最小示例。主要细节是必须调用主文件index.Rmd,并且必须包括其他YAML行site: bookdown::bookdown_site

索引

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

01-介绍Rmd

# Chapter 1

This is chapter 1.

```{r}
1
```

02-介绍Rmd

# Chapter 2

This is chapter 2.

```{r}
2
```

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

在此处输入图片说明

一旦您熟悉了此基本设置,就可以使用其他配置文件轻松地自定义预订文档和输出格式_bookdown.yml,例如_output.yml

进一步阅读


是否可以通过这种方式渲染嵌套的Rmd文件?怎么样?我想为一章中的每个元素使用一个Rmd 。
jangorecki

bookdown一般建议每个文件包含一个章节。但是,如果需要,应该可以拆分成单独的文件。最简单的方法将是提供每个文件与一个数字索引诸如1-1,1-2,1-3等
迈克尔哈珀

我试图在末尾添加附录,该附录显示了两个文档的代码。我该如何实现?
Naveen Gabriel

这似乎是一个截然不同的问题。您可能想打开另一个问题,并提供一个完整的示例,我将尽力回答:)
Michael Harper

澄清:Knit仅预览当前文档,而“ Build book”将全部构建。
Rasmus Larsen

4

这对我有用:

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软件包中包含类似这样的东西会很高兴。


9
我认为这是一个合理的解决方案,只不过您忘记了一些括号(和缩进!! :)
Yihui Xie
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.