จะรวมไฟล์ RMarkdown (.Rmd) สองไฟล์เป็นเอาต์พุตเดียวได้อย่างไร


104

ฉันมีสองไฟล์ในโฟลเดอร์เดียวกัน: chapter1.Rmd และ chapter2.Rmd โดยมีเนื้อหาดังต่อไปนี้:

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)

ฉันจะถักสิ่งเหล่านี้เพื่อรวมเป็นไฟล์ PDF เดียวได้อย่างไร

แน่นอนว่าrender(input = "chapter1.Rmd", output_format = "pdf_document")ทำงานได้อย่างสมบูรณ์ แต่render(input = "chapter1.Rmd", input = "chapter2.Rmd", output_format = "pdf_document")ไม่

ทำไมฉันถึงอยากทำสิ่งนี้ เพื่อแยกเอกสารขนาดใหญ่ออกเป็นไฟล์ตรรกะ

ฉันใช้แพ็คเกจ bookdown ของ@hadleyเพื่อสร้างลาเท็กซ์จาก. Rmd แต่ดูเหมือนว่าจะมากเกินไปสำหรับงานนี้โดยเฉพาะ มีวิธีง่ายๆโดยใช้บรรทัดคำสั่ง knitr / pandoc / linux ที่ฉันหายไปหรือไม่? ขอบคุณ.


1
ทำไมไม่เขียนแบบเนทีฟใน LaTeX ดูเหมือนว่าเครื่องมือทั้งหมดที่คุณต้องการสำหรับสิ่งนี้มีอยู่ใน LaTeX และกระบวนการถักจะเรียกใช้เอกสารของคุณผ่านเอ็นจิ้น TeX
Thomas

14
ใช่ฉันชอบลาเท็กซ์และต้องฝังโค้ดลงไปดังนั้นจึงเป็นแผนที่ดี B. การทำงานกับโซลูชัน R พร้อมฟังก์ชัน read / writeLines ATM เพราะฉันเชื่อว่า Markdown เป็นอนาคตที่ใช้งานง่าย! arxiv.org/abs/1402.1894 นั่นคือการตัดสินใจเชิงปรัชญา: เป็นการเปลี่ยนแปลงที่คุณต้องการเห็นในโลก
RobinLovelace

2
นอกจากนี้การเขียนเป็น markdown ช่วยลดอุปสรรคในการเข้าร่วมสนับสนุน ในที่สุดมันก็จะเป็น LaTeX แต่สำหรับเวลาที่ markdown ก็เพียงพอ
RobinLovelace

4
หนังสือเล่มนี้ของ hadley ได้รับการพัฒนาโดย @yihui และมีงานเพิ่มเติมและเอกสารที่เป็นประโยชน์มากมาย: rstudio.github.io/bookdown
Ben

คำตอบ:


143

อัปเดตเดือนสิงหาคม 2018:คำตอบนี้เขียนขึ้นก่อนการมาถึงของbookdownซึ่งเป็นแนวทางที่มีประสิทธิภาพมากขึ้นในการเขียนหนังสือที่ใช้ Rmarkdown ดูตัวอย่างการจองขั้นต่ำในคำตอบของ @ Mikey-Harper !

เมื่อฉันต้องการแยกรายงานขนาดใหญ่ออกเป็น Rmd แยกกันฉันมักจะสร้าง Rmd หลักและรวมบทเป็นย่อย วิธีนี้เป็นวิธีที่ง่ายสำหรับผู้ใช้ใหม่ที่จะเข้าใจและหากคุณรวมสารบัญ (toc) ไว้ด้วยก็จะง่ายต่อการไปยังส่วนต่างๆระหว่างบทต่างๆ

รายงาน

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

สร้าง

rmarkdown::render('report.Rmd')

ซึ่งผลิต: รายงานของฉัน

และหากคุณต้องการวิธีที่รวดเร็วในการสร้างชิ้นส่วนสำหรับเอกสารลูกของคุณ:

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

มันใช้งานได้ แต่ฉันมี 10 บท เมื่อฉันเรนเดอร์ไฟล์มันจะขึ้นไฟล์ที่ 5 ฉันสามารถดูชื่อเรื่องทั้งหมดจากแผงการนำทาง PDF แต่ไม่แสดงหน้า
Suat Atan PhD

28

ฉันขอแนะนำให้ผู้ใช้ใช้แพ็คเกจbookdownเพื่อสร้างรายงานจากไฟล์ R Markdown หลายไฟล์ เพิ่มคุณสมบัติที่มีประโยชน์มากมายเช่นการอ้างอิงข้ามซึ่งมีประโยชน์มากสำหรับเอกสารที่ยาวขึ้น

การปรับตัวอย่างจาก@Eric ต่อไปนี้เป็นตัวอย่างขั้นต่ำของการตั้งค่าbookdown รายละเอียดหลักคือต้องเรียกไฟล์หลักindex.Rmdและต้องรวมบรรทัด YAML เพิ่มเติมsite: bookdown::bookdown_site:

ดัชนี 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
```

หากเรา Knit index.Rmd bookdownจะรวมไฟล์ทั้งหมดในไดเร็กทอรีเดียวกันตามลำดับตัวอักษร (พฤติกรรมนี้สามารถเปลี่ยนแปลงได้โดยใช้_bookdown.ymlไฟล์เสริม)

ป้อนคำอธิบายภาพที่นี่

เมื่อคุณคุ้นเคยกับการตั้งค่าพื้นฐานนี้แล้วคุณสามารถปรับแต่งเอกสาร bookdown และรูปแบบเอาต์พุตได้อย่างง่ายดายโดยใช้ไฟล์การกำหนดค่าเพิ่มเติมเช่น_bookdown.ymlและ_output.yml

อ่านเพิ่มเติม


เป็นไปได้ไหมที่จะสร้างไฟล์ Rmd ที่ซ้อนกันด้วยวิธีนี้ ยังไง ฉันอยากมีคนเดียว RMD สำหรับองค์ประกอบในแต่ละบท
jangorecki

โดยทั่วไปแล้วbookdownจะแนะนำให้แต่ละไฟล์มีหนึ่งบท อย่างไรก็ตามควรแยกเป็นไฟล์แยกกันได้หากต้องการ วิธีที่ง่ายที่สุดคือให้แต่ละไฟล์มีดัชนีตัวเลขเช่น 1-1, 1-2, 1-3 เป็นต้น
Michael Harper

ฉันพยายามเพิ่มภาคผนวกในตอนท้ายซึ่งแสดงรหัสสำหรับทั้งสองเอกสาร ฉันจะบรรลุได้อย่างไร?
Naveen Gabriel

ดูเหมือนจะเป็นคำถามที่แตกต่างกันอย่างชัดเจน คุณอาจต้องการเปิดคำถามอื่นและให้ตัวอย่างที่สมบูรณ์ซึ่งฉันจะพยายามตอบให้ดีที่สุด :)
Michael Harper

การชี้แจง: Knit แสดงตัวอย่างเอกสารปัจจุบันเท่านั้นในขณะที่ "Build book" จะสร้างทั้งหมด
Rasmus Larsen

4

สิ่งนี้ใช้ได้ผลสำหรับฉัน:

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

ลองนึกภาพว่ามีวิธีแก้ปัญหาที่ดีกว่าและคงจะดีหากมีสิ่งนี้ในแพ็คเกจ rmarkdown หรือ knitr


9
ฉันคิดว่านี่เป็นวิธีแก้ปัญหาที่สมเหตุสมผลยกเว้นคุณลืมวงเล็บบางส่วน (และการเยื้อง !! :)
Yihui Xie
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.