¿Cómo combinar dos archivos de RMarkdown (.Rmd) en una sola salida?

Tengo dos archivos en la misma carpeta: chapter1.Rmd y chapter2.Rmd, con el siguiente contenido:

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) 

¿Cómo puedo tejer estos para que se combinen en una sola salida en pdf?

Por supuesto, render(input = "chapter1.Rmd", output_format = "pdf_document") funciona a la perfección pero el render(input = "chapter1.Rmd", input = "chapter2.Rmd", output_format = "pdf_document") no funciona.

¿Por qué quiero hacer esto? Para dividir un documento gigante en archivos lógicos.

He usado el paquete de contabilidad de @hadley para construir látex desde .Rmd, pero esto parece excesivo para esta tarea en particular. ¿Existe una solución simple usando la línea de comando knitr / pandoc / linux que me falta? Gracias.

Actualización de agosto de 2018: esta respuesta fue escrita antes del advenimiento de bookdown , que es un enfoque más poderoso para escribir libros basados ​​en Rmarkdown. ¡Mira el ejemplo de contabilidad mínima en la respuesta de @ Mikey-Harper!

Cuando quiero dividir un informe grande en Rmd por separado, generalmente creo un Rmd padre e incluyo los capítulos como secundarios. Este enfoque es fácil de entender para los nuevos usuarios, y si incluye una tabla de contenidos (toc), es fácil navegar entre capítulos.

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 ``` 

Construir

 rmarkdown::render('report.Rmd') 

Que produce: Mi reporte

Y si desea una forma rápida de crear los fragmentos para sus documentos secundarios:

 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'} # ``` 

Recomendaría que las personas usen el paquete de contabilidad para crear informes a partir de múltiples archivos de R Markdown. Agrega muchas funciones útiles, como referencias cruzadas, que son muy útiles para documentos más largos.

Adaptando el ejemplo de @Eric , aquí hay un ejemplo mínimo de la configuración de contabilidad . El detalle principal es que el archivo principal se debe llamar index.Rmd , y debe incluir el site: bookdown::bookdown_site línea YAML adicional 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 ``` 

Si index.Rmd el index.Rmd El index.Rmd Rmd fusionará todos los archivos en el mismo directorio en orden alfabético (este comportamiento se puede cambiar usando un archivo _bookdown.yml adicional).

enter image description here

Una vez que se sienta cómodo con esta configuración básica, es fácil personalizar el documento de cierre y los formatos de salida usando archivos de configuración adicionales, es decir _bookdown.yml y _output.yml

Otras lecturas

  • R Markdown: la guía definitiva : el Capítulo 11 proporciona una gran visión general de bookdown
  • Los libros de autor con bookdown brindan una guía completa sobre bookdown y se recomiendan para obtener detalles más avanzados.

Esto funcionó para mí:

 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) } 

Imagine que hay una mejor solución y sería bueno tener algo así en los paquetes rmarkdown o knitr.