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

100

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

chapitre1.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 qu'ils se combinent 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? Décomposer un document géant en fichiers logiques.

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

RobinLovelace
la source
1
Pourquoi ne pas simplement écrire nativement en LaTeX? Il semble que tous les outils dont vous avez besoin pour cela sont intégrés à LaTeX et que le processus de tricotage exécute de toute façon votre document via un moteur TeX.
Thomas
13
Oui, j'aime le latex et je dois y intégrer du code, c'est donc un bon plan B. Travailler sur une solution R avec la fonction de lecture / écriture des lignes ATM parce que je crois que Markdown est l'avenir convivial! arxiv.org/abs/1402.1894 C'est une décision philosophique: soyez le changement que vous voulez voir dans le monde.
RobinLovelace
2
En outre, écrire sous forme de démarque réduit la barrière à l'entrée pour contribuer. Finalement, ce sera LaTeX, mais pour le moment, la démarque est suffisante.
RobinLovelace
4
Le livre de hadley est maintenant développé par @yihui et a eu beaucoup de travail supplémentaire et de documentation utile: rstudio.github.io/bookdown
Ben

Réponses:

138

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

Lorsque je veux 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'}
```

chapitre1.Rmd

# Chapter 1

This is chapter 1.

```{r}
1
```

chapitre2.Rmd

# Chapter 2

This is chapter 2.

```{r}
2
```

Construire

rmarkdown::render('report.Rmd')

Ce qui produit: Mon rapport

Et si vous voulez un moyen rapide de créer les blocs 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'}
# ```
Eric
la source
Cela fonctionne, mais j'ai 10 chapitre. Lorsque je rend les fichiers, il passe au 5ème fichier. Je peux voir tous les titres du panneau de navigation PDF mais les pages ne sont pas affichées.
Suat Atan PhD
26

Je recommanderais aux gens d'utiliser le package bookdown pour créer des rapports à partir de plusieurs fichiers R Markdown. Il ajoute de nombreuses fonctionnalités utiles telles que 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 de la réservation . Le détail principal est que le fichier principal doit être appelé index.Rmdet 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 index.Rmd tricotons, le bookdown fusionnera tous les fichiers dans le même répertoire par ordre alphabétique (ce comportement peut être modifié en utilisant un _bookdown.ymlfichier supplémentaire ).

entrez la description de l'image ici

Une fois que vous vous êtes familiarisé avec cette configuration de base, il est facile de personnaliser le document bookdown et les formats de sortie en utilisant des fichiers de configuration supplémentaires, c'est _bookdown.yml-à- dire et_output.yml

Lectures complémentaires

Michael Harper
la source
est-il possible de rendre des fichiers Rmd imbriqués de cette façon? Comment? Je voudrais avoir un seul Rmd pour chaque élément d'un chapitre .
jangorecki
bookdown recommande généralement que chaque fichier contienne un chapitre. Cependant, il devrait être possible de diviser en fichiers séparés si vous le souhaitez. Le moyen le plus simple serait de fournir à chaque fichier un index numérique tel que 1-1, 1-2, 1-3 etc.
Michael Harper
J'essayais d'ajouter une annexe à la fin qui montre le code pour les deux documents. Comment puis-je y parvenir?
Naveen Gabriel
Cela semble être une question distincte. Vous voudrez peut-être ouvrir une autre question et fournir un exemple complet auquel je ferai de mon mieux pour répondre :)
Michael Harper
Clarification: Knit ne prévisualise que le document actuel, tandis que "Build book" construit tout.
Rasmus Larsen le
4

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 que ce serait bien d'avoir quelque chose comme ça dans les packages rmarkdown ou knitr.

RobinLovelace
la source
9
Je pense que c'est une solution raisonnable, sauf que vous avez oublié quelques parenthèses (et l'indentation !! :)
Yihui Xie