Wie kombiniere ich zwei RMarkdown (.Rmd) -Dateien in einer einzigen Ausgabe?

99

Ich habe zwei Dateien im selben Ordner: Kapitel1.Rmd und Kapitel2.Rmd mit folgendem Inhalt:

Kapitel 1.Rmd

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

## This is chapter 1. {#Chapter1}

Next up: [chapter 2](#Chapter2)

Kapitel 2.Rmd

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

## This is chapter 2. {#Chapter2}

Previously: [chapter 1](#Chapter1)

Wie kann ich diese so stricken, dass sie zu einer einzigen PDF-Ausgabe kombiniert werden?

Funktioniert natürlich render(input = "chapter1.Rmd", output_format = "pdf_document")perfekt , funktioniert aber render(input = "chapter1.Rmd", input = "chapter2.Rmd", output_format = "pdf_document")nicht.

Warum möchte ich das tun? Ein riesiges Dokument in logische Dateien aufteilen.

Ich habe @hadley ‚s verwendet bookdown Paket zu erstellen Latex aus .Rmd aber dies scheint übertrieben für diese besondere Aufgabe. Gibt es eine einfache Lösung mit der Befehlszeile knitr / pandoc / linux, die mir fehlt? Vielen Dank.

RobinLovelace
quelle
1
Warum nicht einfach nativ in LaTeX schreiben? Anscheinend sind alle Werkzeuge, die Sie dafür benötigen, in LaTeX integriert, und der Strickprozess führt Ihr Dokument trotzdem über eine TeX-Engine aus.
Thomas
13
Ja, ich mag Latex und muss Code einbetten, damit das ein guter Plan ist. B. Arbeiten an einer R-Lösung mit Geldautomaten mit Lese- / Schreiblinienfunktion, weil ich glaube, dass Markdown die benutzerfreundliche Zukunft ist! arxiv.org/abs/1402.1894 Dh es ist eine philosophische Entscheidung: Sei die Veränderung, die du in der Welt sehen willst.
RobinLovelace
2
Außerdem verringert das Schreiben als Abschlag die Eintrittsbarriere für Beiträge. Irgendwann wird es LaTeX sein, aber vorerst ist ein Abschlag ausreichend.
RobinLovelace
4
Hadleys Bookdown wird jetzt von @yihui entwickelt und hat viel weitere Arbeit und nützliche Dokumentation: rstudio.github.io/bookdown
Ben

Antworten:

136

Update August 2018: Diese Antwort wurde vor dem Aufkommen von Bookdown geschrieben. Dies ist ein leistungsfähigerer Ansatz zum Schreiben von Rmarkdown-basierten Büchern. Schauen Sie sich das Beispiel für eine minimale Buchung in der Antwort von @ Mikey-Harper an !

Wenn ich einen großen Bericht in separate Rmd aufteilen möchte, erstelle ich normalerweise eine übergeordnete Rmd und füge die Kapitel als untergeordnete hinzu. Dieser Ansatz ist für neue Benutzer leicht zu verstehen. Wenn Sie ein Inhaltsverzeichnis (toc) einfügen, können Sie leicht zwischen den Kapiteln navigieren.

report.Rmd

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

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

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

Kapitel 1.Rmd

# Chapter 1

This is chapter 1.

```{r}
1
```

Kapitel 2.Rmd

# Chapter 2

This is chapter 2.

```{r}
2
```

Bauen

rmarkdown::render('report.Rmd')

Welches produziert: Mein Bericht

Und wenn Sie schnell die Blöcke für Ihre untergeordneten Dokumente erstellen möchten:

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
quelle
Es funktioniert, aber ich habe 10 Kapitel. Wenn ich die Dateien rendere, geht es bis zur 5. Datei. Ich kann alle Titel im PDF-Navigationsbereich sehen, aber die Seiten werden nicht angezeigt.
Suat Atan PhD
26

Ich würde empfehlen, dass Benutzer das Bookdown- Paket zum Erstellen von Berichten aus mehreren R Markdown-Dateien verwenden. Es werden viele nützliche Funktionen wie Querverweise hinzugefügt, die für längere Dokumente sehr nützlich sind.

Wenn Sie das Beispiel von @Eric anpassen , finden Sie hier ein minimales Beispiel für das Bookdown- Setup. Das Hauptdetail ist, dass die Hauptdatei aufgerufen index.Rmdwerden muss und die zusätzliche YAML-Zeile enthalten muss 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
```

Wenn wir index.Rmd stricken, werden alle Dateien im selben Verzeichnis in alphabetischer Reihenfolge zusammengeführt (dieses Verhalten kann mithilfe einer zusätzlichen _bookdown.ymlDatei geändert werden ).

Geben Sie hier die Bildbeschreibung ein

Sobald Sie mit dieser Grundeinstellung vertraut sind, können Sie das Buchungsdokument und die Ausgabeformate mithilfe zusätzlicher Konfigurationsdateien (z. B. _bookdown.ymlund) einfach anpassen_output.yml

Weiterführende Literatur

Michael Harper
quelle
Ist es möglich, verschachtelte Rmd-Dateien auf diese Weise zu rendern? Wie? Ich hätte gerne einen einzelnen Rmd für jedes Element in einem Kapitel .
Jangorecki
Bookdown empfiehlt im Allgemeinen, dass jede Datei ein Kapitel enthält. Falls gewünscht, sollte es jedoch möglich sein, diese in separate Dateien aufzuteilen. Der einfachste Weg wäre, jede Datei mit einem numerischen Index wie 1-1, 1-2, 1-3 usw. zu versehen.
Michael Harper
Ich habe versucht, am Ende einen Anhang hinzuzufügen, der den Code für beide Dokumente enthält. Wie kann ich erreichen?
Naveen Gabriel
Dies scheint eine ganz andere Frage zu sein. Vielleicht möchten Sie eine weitere Frage öffnen und ein vollständiges Beispiel bereitstellen, das ich nach besten Kräften beantworten werde :)
Michael Harper
Erläuterung: Knit zeigt nur eine Vorschau des aktuellen Dokuments an, während "Build Book" alles erstellt.
Rasmus Larsen
4

Das hat bei mir funktioniert:

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

Stellen Sie sich vor, es gibt eine bessere Lösung und es wäre schön, so etwas in Rmarkdown- oder Knitr-Paketen zu haben.

RobinLovelace
quelle
9
Ich denke, dies ist eine vernünftige Lösung, außer dass Sie ein paar Klammern (und Einrückungen !! :) vergessen haben
Yihui Xie