Jak połączyć dwa pliki RMarkdown (.Rmd) w jedno wyjście?

102

Mam dwa pliki w tym samym folderze: Chapter1.Rmd i Chapter2.Rmd, o następującej zawartości:

Chapter1.Rmd

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

## This is chapter 1. {#Chapter1}

Next up: [chapter 2](#Chapter2)

Chapter2.Rmd

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

## This is chapter 2. {#Chapter2}

Previously: [chapter 1](#Chapter1)

Jak mogę to zrobić na drutach, aby połączyć je w jeden plik wyjściowy PDF?

Oczywiście render(input = "chapter1.Rmd", output_format = "pdf_document")działa idealnie, ale render(input = "chapter1.Rmd", input = "chapter2.Rmd", output_format = "pdf_document")nie działa.

Dlaczego chcę to zrobić? Aby rozbić gigantyczny dokument na pliki logiczne.

Użyłem @hadley „s bookdown pakiet zbudować lateksu z .Rmd ale wydaje się to przesadą dla tego konkretnego zadania. Czy istnieje proste rozwiązanie za pomocą wiersza poleceń knitr / pandoc / linux, którego mi brakuje? Dzięki.

RobinLovelace
źródło
1
Dlaczego nie pisać natywnie w LaTeX? Wygląda na to, że wszystkie potrzebne do tego narzędzia są wbudowane w LaTeX, a proces dziania i tak przepuszcza dokument przez silnik TeX.
Thomas,
13
Tak, lubię lateks i muszę zająć się osadzaniem w nim kodu, więc to dobry plan B. Praca nad rozwiązaniem R z funkcją odczytu / zapisu linii ATM, ponieważ uważam, że Markdown to przyjazna dla użytkownika przyszłość! arxiv.org/abs/1402.1894 Tzn. to decyzja filozoficzna: bądź zmianą, którą chcesz zobaczyć w świecie.
RobinLovelace,
2
Również pisanie jako przecena zmniejsza barierę wejścia do udziału. Ostatecznie będzie to LaTeX, ale na razie przecena jest wystarczająca.
RobinLovelace,
4
Bookdown hadleya jest teraz opracowywany przez @yihui i ma wiele dalszej pracy i użytecznej dokumentacji: rstudio.github.io/bookdown
Ben

Odpowiedzi:

140

Aktualizacja z sierpnia 2018 r .: Ta odpowiedź została napisana przed pojawieniem się bookdown , który jest potężniejszym podejściem do pisania książek opartych na Rmarkdown. Sprawdź minimalną bookdown przykład w @ Mikey-Harpera odpowiedź !

Kiedy chcę podzielić duży raport na oddzielne Rmd, zwykle tworzę nadrzędny Rmd i dołączam rozdziały jako dzieci. To podejście jest łatwe do zrozumienia dla nowych użytkowników, a jeśli dołączysz spis treści (toc), łatwo będzie nawigować między rozdziałami.

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

Chapter2.Rmd

# Chapter 2

This is chapter 2.

```{r}
2
```

Budować

rmarkdown::render('report.Rmd')

Który produkuje: Mój raport

A jeśli chcesz szybko utworzyć fragmenty dokumentów podrzędnych:

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
źródło
Działa, ale mam 10 rozdziałów. Kiedy renderuję pliki, dochodzi do piątego pliku. Widzę wszystkie tytuły z panelu nawigacyjnego PDF, ale strony nie są wyświetlane.
dr Suat Atan
26

Poleciłbym, aby ludzie używali pakietu bookdown do tworzenia raportów z wielu plików R Markdown. Dodaje wiele przydatnych funkcji, takich jak odsyłacze, które są bardzo przydatne w przypadku dłuższych dokumentów.

Dostosowując przykład z @Eric , oto minimalny przykład konfiguracji bookdown . Głównym szczegółem jest to, że plik główny musi zostać wywołany index.Rmdi musi zawierać dodatkową linię YAML 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
```

Jeśli zrobimy Knit, index.Rmd bookdown połączy wszystkie pliki w tym samym katalogu w kolejności alfabetycznej (to zachowanie można zmienić za pomocą dodatkowego _bookdown.ymlpliku).

wprowadź opis obrazu tutaj

Gdy już zaznajomisz się z tą podstawową konfiguracją, możesz łatwo dostosować dokument bookdown i formaty wyjściowe za pomocą dodatkowych plików konfiguracyjnych, tj. _bookdown.ymlI_output.yml

Dalsze czytanie

Michael Harper
źródło
czy można w ten sposób renderować zagnieżdżone pliki Rmd? w jaki sposób? Chciałbym mieć jeden Rmd dla każdego elementu w rozdziale .
jangorecki
bookdown ogólnie zaleca, aby każdy plik zawierał jeden rozdział. Jednak w razie potrzeby powinno być możliwe podzielenie na oddzielne pliki. Najłatwiej byłoby nadać każdemu plikowi indeks numeryczny, taki jak 1-1, 1-2, 1-3 itd.
Michael Harper,
Próbowałem dodać na końcu dodatek, który pokazuje kod dla obu dokumentów. Jak mogę to osiągnąć?
Naveen Gabriel
Wydaje się, że to zupełnie inne pytanie. Możesz otworzyć kolejne pytanie i podać kompletny przykład, na który postaram się odpowiedzieć :)
Michael Harper
Wyjaśnienie: Knit wyświetla tylko podgląd aktualnego dokumentu, podczas gdy „książka kompilacji” tworzy wszystko.
Rasmus Larsen
4

To zadziałało dla mnie:

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

Wyobraź sobie, że istnieje lepsze rozwiązanie i byłoby miło mieć coś takiego w pakietach rmarkdown lub knitr.

RobinLovelace
źródło
9
Myślę, że to rozsądne rozwiązanie, poza tym, że zapomniałeś o kilku nawiasach (i wcięciu !! :)
Yihui Xie