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.