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


100

Tengo dos archivos en la misma carpeta: capítulo1.Rmd y capítulo2.Rmd, con el siguiente contenido:

capítulo1.Rmd

---
title: "Chapter 1"
output: pdf_document
---

## This is chapter 1. {#Chapter1}

Next up: [chapter 2](#Chapter2)

capítulo2.Rmd

---
title: "Chapter 2"
output: pdf_document
---

## This is chapter 2. {#Chapter2}

Previously: [chapter 1](#Chapter1)

¿Cómo puedo tejerlos para que se combinen en una sola salida en PDF?

Por supuesto, render(input = "chapter1.Rmd", output_format = "pdf_document")funciona perfectamente pero render(input = "chapter1.Rmd", input = "chapter2.Rmd", output_format = "pdf_document")no lo hace.

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

He usado el paquete bookdown de @hadley para construir latex a partir de .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.


1
¿Por qué no escribir de forma nativa en LaTeX? Parece que todas las herramientas que necesita para esto están integradas en LaTeX y el proceso de tejido ejecuta su documento a través de un motor TeX de todos modos.
— Thomas

13
Sí, me gusta el látex y necesito incorporar código en él, así que es un buen plan B. Trabajar en una solución R con función de lectura / escritura de líneas ATM porque creo que Markdown es el futuro fácil de usar. arxiv.org/abs/1402.1894 Es decir, es una decisión filosófica: sé el cambio que quieres ver en el mundo.
— RobinLovelace

2
Además, escribir como rebaja reduce la barrera de entrada para contribuir. Eventualmente será LaTeX, pero por el momento la rebaja es suficiente.
— RobinLovelace

4
El bookdown de hadley ahora lo está desarrollando @yihui y ha tenido mucho trabajo adicional y documentación útil: rstudio.github.io/bookdown
— Ben

Respuestas:


138

Actualización de agosto de 2018: esta respuesta se escribió antes de la llegada de bookdown , que es un enfoque más poderoso para escribir libros basados ​​en Rmarkdown. ¡Mira el ejemplo de bookdown mínimo en la respuesta de @ Mikey-Harper !

Cuando quiero dividir un informe grande en Rmd separados, normalmente creo un Rmd principal e incluyo los capítulos como hijos. Este enfoque es fácil de entender para los nuevos usuarios, y si incluye una tabla de contenido (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'}
```

capítulo1.Rmd

# Chapter 1

This is chapter 1.

```{r}
1
```

capítulo2.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 los documentos de su hijo:

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

Funciona, pero tengo 10 capítulos. Cuando renderizo los archivos, sube al quinto archivo. Puedo ver todos los títulos desde el panel de navegación de PDF, pero no se muestran las páginas.
— Suat Atan PhD

26

Recomendaría que las personas usen el paquete bookdown para crear informes a partir de varios archivos de R Markdown. Agrega muchas características ú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 bookdown . El detalle principal es que se debe llamar al archivo principal index.Rmdy debe incluir la 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 tejemos, el bookdown fusionará todos los archivos en el mismo directorio en orden alfabético (este comportamiento se puede cambiar usando un _bookdown.ymlarchivo adicional ).

ingrese la descripción de la imagen aquí

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

Otras lecturas


¿Es posible renderizar archivos Rmd anidados de esta manera? ¿cómo? Me gustaría tener un Rmd único para cada elemento de un capítulo .
— jangorecki

bookdown generalmente recomienda que cada archivo contenga un capítulo. Sin embargo, debería ser posible dividirlos en archivos separados si lo desea. La forma más sencilla sería proporcionar a cada archivo un índice numérico como 1-1, 1-2, 1-3, etc.
— Michael Harper

Estaba tratando de agregar un apéndice al final que muestra el código para ambos documentos. ¿Cómo puedo lograrlo?
— Naveen Gabriel

Esta parece una pregunta distinta. Es posible que desee abrir otra pregunta y proporcionar un ejemplo completo que haré todo lo posible para responder :)
— Michael Harper

Aclaración: Knit solo muestra una vista previa del documento actual, mientras que "Crear libro" lo crea todo.
— Rasmus Larsen

4

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

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


9
Creo que esta es una solución razonable, excepto que olvidó algunos paréntesis (¡y sangría! :)
— Yihui Xie
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.