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:
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).
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.