¿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.