Come combinare due file RMarkdown (.Rmd) in un unico output?


102

Ho due file nella stessa cartella: chapter1.Rmd e chapter2.Rmd, con il seguente contenuto:

capitolo1.Rmd

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

## This is chapter 1. {#Chapter1}

Next up: [chapter 2](#Chapter2)

capitolo2.Rmd

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

## This is chapter 2. {#Chapter2}

Previously: [chapter 1](#Chapter1)

Come posso lavorarli a maglia in modo che si combinino in un unico output PDF?

Certo, render(input = "chapter1.Rmd", output_format = "pdf_document")funziona perfettamente ma render(input = "chapter1.Rmd", input = "chapter2.Rmd", output_format = "pdf_document")non lo fa.

Perché voglio farlo? Per suddividere un documento gigante in file logici.

Ho usato il pacchetto bookdown di @hadley per creare latex da .Rmd ma questo sembra eccessivo per questo compito particolare. C'è una soluzione semplice usando la riga di comando knitr / pandoc / linux che mi manca? Grazie.


1
Perché non scrivere in modo nativo in LaTeX? Sembra che tutti gli strumenti di cui hai bisogno per questo siano incorporati in LaTeX e il processo di lavorazione a maglia esegue comunque il tuo documento attraverso un motore TeX.
Thomas,

13
Sì, mi piace il latex e ho bisogno di incorporare il codice in esso, quindi è un buon piano B. Lavorare su una soluzione R con la funzione read / writeLines ATM perché credo che Markdown sia il futuro user-friendly! arxiv.org/abs/1402.1894 Cioè è una decisione filosofica: sii il cambiamento che vuoi vedere nel mondo.
RobinLovelace

2
Inoltre, scrivere come markdown riduce la barriera all'ingresso per contribuire. Alla fine sarà LaTeX, ma per il momento il markdown è sufficiente.
RobinLovelace

4
Il bookdown di hadley è ora in fase di sviluppo da @yihui e ha avuto molto altro lavoro e documentazione utile: rstudio.github.io/bookdown
Ben

Risposte:


140

Aggiornamento agosto 2018: questa risposta è stata scritta prima dell'avvento del bookdown , che è un approccio più potente alla scrittura di libri basati su Rmarkdown. Controlla la minima bookdown esempio @ di Mikey-Harper risposta !

Quando desidero suddividere un report di grandi dimensioni in Rmd separato, di solito creo un Rmd padre e includo i capitoli come figli. Questo approccio è facile da capire per i nuovi utenti e, se includi un sommario (toc), è facile navigare tra i capitoli.

report.Rmd

---  
title: My Report  
output: 
  pdf_document:
    toc: yes 
---

```{r child = 'chapter1.Rmd'}
```

```{r child = 'chapter2.Rmd'}
```

capitolo1.Rmd

# Chapter 1

This is chapter 1.

```{r}
1
```

capitolo2.Rmd

# Chapter 2

This is chapter 2.

```{r}
2
```

Costruire

rmarkdown::render('report.Rmd')

Che produce: La mia relazione

E se vuoi un modo rapido per creare i blocchi per i tuoi documenti figlio:

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

Funziona, ma ho 10 capitoli. Quando eseguo il rendering dei file, sale al quinto file. Posso vedere tutti i titoli dal pannello di navigazione PDF ma le pagine non vengono mostrate.
Suat Atan PhD

26

Consiglierei alle persone di utilizzare il pacchetto bookdown per creare report da più file R Markdown. Aggiunge molte funzioni utili come i riferimenti incrociati che sono molto utili per documenti più lunghi.

Adattando l'esempio di @Eric , ecco un esempio minimo della configurazione del bookdown . Il dettaglio principale è che il file principale deve essere chiamato index.Rmde deve includere la riga YAML aggiuntiva 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
```

Se lavoriamo a maglia, il index.Rmd bookdown unirà tutti i file nella stessa directory in ordine alfabetico (questo comportamento può essere modificato utilizzando un _bookdown.ymlfile aggiuntivo ).

inserisci qui la descrizione dell'immagine

Una volta acquisita dimestichezza con questa configurazione di base, è facile personalizzare il documento bookdown ei formati di output utilizzando file di configurazione aggiuntivi, ad esempio _bookdown.ymle_output.yml

Ulteriori letture


è possibile rendere i file Rmd nidificati in questo modo? Come? Vorrei avere un singolo Rmd per ogni elemento in un capitolo .
jangorecki

bookdown generalmente consiglia che ogni file contenga un capitolo. Tuttavia, dovrebbe essere possibile dividere in file separati se lo si desidera. Il modo più semplice sarebbe fornire a ciascun file un indice numerico come 1-1, 1-2, 1-3 ecc.
Michael Harper

Stavo cercando di aggiungere un'appendice alla fine che mostra il codice per entrambi i documenti. Come posso ottenerlo?
Naveen Gabriel

Questa sembra una domanda diversa e distinta. Potresti voler aprire un'altra domanda e fornire un esempio completo a cui farò del mio meglio per rispondere :)
Michael Harper

Chiarimento: Knit visualizza solo l'anteprima del documento corrente, mentre "Build book" crea tutto.
Rasmus Larsen

4

Questo ha funzionato per me:

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

Immagina che ci sia una soluzione migliore e che sarebbe bello avere qualcosa di simile nei pacchetti rmarkdown o knitr.


9
Penso che questa sia una soluzione ragionevole, tranne per il fatto che hai dimenticato alcune parentesi (e il rientro !! :)
Yihui Xie
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.