我在同一个文件夹中有两个文件: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命令行的简单解决方案我不见了?感谢。
答案 0 :(得分:108)
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'}
```
chapter1.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'}
# ```
答案 1 :(得分:16)
我建议人们使用 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
```
如果我们编织index.Rmd
bookdown ,将按字母顺序合并同一目录中的所有文件(可以使用额外的_bookdown.yml
文件来更改此行为)。 / p>
一旦您熟悉了此基本设置,就可以使用其他配置文件(即_bookdown.yml
和_output.yml
进一步阅读
- R Markdown: The definitive Guide:第11章对书本进行了很好的概述
- Authoring books with bookdown提供了有关书本的全面指南,建议使用更高级的细节。
答案 2 :(得分: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包中有这样的东西。