Bagaimana cara menggabungkan dua file RMarkdown (.Rmd) menjadi satu output?


102

Saya memiliki dua file di folder yang sama: chapter1.Rmd dan chapter2.Rmd, dengan konten berikut:

bab1.Rmd

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

## This is chapter 1. {#Chapter1}

Next up: [chapter 2](#Chapter2)

bab2.Rmd

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

## This is chapter 2. {#Chapter2}

Previously: [chapter 1](#Chapter1)

Bagaimana saya bisa merajut ini sehingga digabungkan menjadi satu keluaran pdf?

Tentu saja, render(input = "chapter1.Rmd", output_format = "pdf_document")bekerja dengan sempurna tetapi render(input = "chapter1.Rmd", input = "chapter2.Rmd", output_format = "pdf_document")tidak.

Mengapa saya ingin melakukan ini? Untuk memecah dokumen raksasa menjadi file logis.

Saya telah menggunakan paket bookdown @hadley untuk membangun lateks dari .Rmd tetapi ini sepertinya berlebihan untuk tugas khusus ini. Apakah ada solusi sederhana menggunakan baris perintah knitr / pandoc / linux yang saya lewatkan? Terima kasih.


1
Mengapa tidak menulis secara native di LaTeX? Sepertinya semua alat yang Anda butuhkan untuk ini dibangun ke dalam LaTeX dan proses merajut tetap menjalankan dokumen Anda melalui mesin TeX.
Thomas

13
Ya, saya suka lateks dan perlu memasukkan kode ke dalamnya sehingga itu adalah rencana yang baik B. Mengerjakan solusi R dengan fungsi read / writeLines ATM karena saya percaya penurunan harga adalah masa depan yang ramah pengguna! arxiv.org/abs/1402.1894 Yaitu keputusan filosofis: jadilah perubahan yang ingin Anda lihat di dunia.
RobinLovelace

2
Juga, menulis sebagai penurunan harga mengurangi hambatan masuk untuk berkontribusi. Akhirnya akan menjadi LaTeX, tetapi untuk saat ini penurunan harga sudah cukup.
RobinLovelace

4
bookdown hadley sekarang sedang dikembangkan oleh @yihui dan telah memiliki banyak pekerjaan lebih lanjut dan dokumentasi yang berguna: rstudio.github.io/bookdown
Ben

Jawaban:


140

Pembaruan Agustus 2018: Jawaban ini ditulis sebelum munculnya bookdown , yang merupakan pendekatan yang lebih kuat untuk menulis buku berbasis Rmarkdown. Check out minimal bookdown contoh di @ Mikey-Harper jawaban !

Ketika saya ingin memecah laporan besar menjadi Rmd terpisah, saya biasanya membuat Rmd induk dan menyertakan bab sebagai anak-anak. Pendekatan ini mudah dipahami oleh pengguna baru, dan jika Anda menyertakan daftar isi (toc), mudah untuk menavigasi antar bab.

report.Rmd

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

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

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

bab1.Rmd

# Chapter 1

This is chapter 1.

```{r}
1
```

bab2.Rmd

# Chapter 2

This is chapter 2.

```{r}
2
```

Membangun

rmarkdown::render('report.Rmd')

Yang menghasilkan: Laporan saya

Dan jika Anda ingin cara cepat membuat potongan untuk dokumen anak Anda:

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

Berhasil, namun saya memiliki 10 bab. Ketika saya membuat file, itu naik ke file ke-5. Saya dapat melihat semua judul dari panel navigasi PDF tetapi halaman tidak ditampilkan.
Suat Atan PhD

26

Saya merekomendasikan agar orang menggunakan paket bookdown untuk membuat laporan dari beberapa file R Markdown. Ia menambahkan banyak fitur berguna seperti referensi silang yang sangat berguna untuk dokumen yang lebih panjang.

Mengadaptasi contoh dari @Eric , berikut adalah contoh minimal dari penyiapan bookdown . Detail utamanya adalah file utama harus dipanggil index.Rmd, dan harus menyertakan baris YAML tambahan 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
```

Jika kita merajut index.Rmd bookdown akan menggabungkan semua file di direktori yang sama dalam urutan abjad (perilaku ini dapat diubah menggunakan _bookdown.ymlfile tambahan ).

masukkan deskripsi gambar di sini

Setelah Anda merasa nyaman dengan pengaturan dasar ini, maka mudah untuk menyesuaikan dokumen bookdown dan format output menggunakan file konfigurasi tambahan yaitu _bookdown.ymldan_output.yml

Bacaan lebih lanjut


apakah mungkin untuk membuat file Rmd bersarang dengan cara ini? bagaimana? Saya ingin memiliki satu Rmd untuk setiap elemen dalam sebuah bab .
jangorecki

bookdown umumnya merekomendasikan setiap file berisi satu bab. Namun, file dapat dipisahkan menjadi beberapa file jika diinginkan. Cara termudah adalah menyediakan setiap file dengan indeks numerik seperti 1-1, 1-2, 1-3 dll.
Michael Harper

Saya mencoba menambahkan lampiran di bagian akhir yang menunjukkan kode untuk kedua dokumen. Bagaimana saya bisa mencapai?
Naveen Gabriel

Ini sepertinya pertanyaan yang berbeda. Anda mungkin ingin membuka pertanyaan lain dan memberikan contoh lengkap yang akan saya coba jawab dengan sebaik mungkin :)
Michael Harper

Klarifikasi: Knit hanya mempratinjau dokumen saat ini, sementara "Buat buku" membuat semuanya.
Rasmus Larsen

4

Ini berhasil untuk saya:

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

Bayangkan ada solusi yang lebih baik dan akan menyenangkan memiliki sesuatu seperti ini dalam paket rmarkdown atau knitr.


9
Saya pikir ini adalah solusi yang masuk akal, kecuali Anda lupa beberapa tanda kurung (dan lekukan !! :)
Yihui Xie
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.