如何将两个 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) 文件组合成一个输出?的主要内容,如果未能解决你的问题,请参考以下文章
终于解决了Rstudio中Rmarkdown的.rmd文件knit为PDF
使用没有 PDF 导航按钮的 rmarkdown 渲染导出为 PDF
使用 shinyAppDir 在 Rmarkdown 中嵌入超过 1 个闪亮的应用程序