web-dev-qa-db-fra.com

Comment combiner deux fichiers RMarkdown (.Rmd) en une seule sortie?

J'ai deux fichiers dans le même dossier: chapter1.Rmd et chapter2.Rmd, avec le contenu suivant:

chapter1.Rmd

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

## This is chapter 1. {#Chapter1}

Next up: [chapter 2](#Chapter2)

chapitre2.Rmd

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

## This is chapter 2. {#Chapter2}

Previously: [chapter 1](#Chapter1)

Comment puis-je les tricoter pour les combiner en une seule sortie PDF?

Bien sûr, render(input = "chapter1.Rmd", output_format = "pdf_document") fonctionne parfaitement mais render(input = "chapter1.Rmd", input = "chapter2.Rmd", output_format = "pdf_document") ne fonctionne pas.

Pourquoi est-ce que je veux faire ça? Pour décomposer un document géant en fichiers logiques.

J'ai utilisé le package bookdown de @hadley pour construire du latex à partir de .Rmd mais cela semble exagéré pour cette tâche particulière. Existe-t-il une solution simple en utilisant la ligne de commande knitr/pandoc/linux qui me manque? Merci.

78
RobinLovelace

Mise à jour d'août 2018: Cette réponse a été écrite avant l'avènement de bookdown , qui est une approche plus puissante pour écrire des livres basés sur Rmarkdown. Consultez l'exemple de livre de compte minimal dans @ Mikey-Harper's réponse !

Lorsque je souhaite diviser un rapport volumineux en Rmd séparé, je crée généralement un Rmd parent et j'inclus les chapitres en tant qu'enfants. Cette approche est facile à comprendre pour les nouveaux utilisateurs et si vous incluez une table des matières (toc), il est facile de naviguer entre les chapitres.

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

chapitre2.Rmd

# Chapter 2

This is chapter 2.

```{r}
2
```

Build

rmarkdown::render('report.Rmd')

Ce qui produit: My report

Et si vous voulez un moyen rapide de créer les morceaux pour vos documents enfants:

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

Je recommande aux utilisateurs d'utiliser le package bookdown pour créer des rapports à partir de plusieurs fichiers R Markdown. Il ajoute de nombreuses fonctionnalités utiles comme les références croisées qui sont très utiles pour les documents plus longs.

En adaptant l'exemple de @ Eric, voici un exemple minimal de la configuration bookdown . Le détail principal est que le fichier principal doit être appelé index.Rmd, et doit inclure la ligne YAML supplémentaire 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 nous tricotons le index.Rmd bookdown fusionnera tous les fichiers du même répertoire dans l'ordre alphabétique (ce comportement peut être modifié à l'aide d'un _ _bookdown.yml fichier).

enter image description here

Une fois que vous vous êtes familiarisé avec cette configuration de base, il est facile de personnaliser le document de réduction et les formats de sortie à l'aide de fichiers de configuration supplémentaires, par exemple _bookdown.yml et _output.yml

Lectures complémentaires

18
Michael Harper

Cela a fonctionné pour moi:

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

Imaginez qu'il existe une meilleure solution et ce serait bien d'avoir quelque chose comme ça dans les packages rmarkdown ou knitr.

4
RobinLovelace