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.
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:
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'}
# ```
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).
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
- R Markdown: The definitive Guide : Le chapitre 11 offre un excellent aperçu de la comptabilité
- Création de livres avec bookdown fournit un guide complet sur bookdown, et recommandé pour des détails plus avancés.
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.