【问题标题】:How to combine two RMarkdown (.Rmd) files into a single output?如何将两个 RMarkdown (.Rmd) 文件组合成一个输出?
【发布时间】: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

标签: r knitr pandoc r-markdown


【解决方案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 文档和输出格式

进一步阅读

【讨论】:

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