Làm cách nào để kết hợp hai tệp RMarkdown (.Rmd) thành một đầu ra duy nhất?


100

Tôi có hai tệp trong cùng một thư mục: chapter1.Rmd và chapter2.Rmd, với nội dung như sau:

chap1.Rmd

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

## This is chapter 1. {#Chapter1}

Next up: [chapter 2](#Chapter2)

chap2.Rmd

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

## This is chapter 2. {#Chapter2}

Previously: [chapter 1](#Chapter1)

Làm cách nào tôi có thể đan chúng để chúng kết hợp thành một đầu ra pdf duy nhất?

Tất nhiên, render(input = "chapter1.Rmd", output_format = "pdf_document")hoạt động hoàn hảo nhưng render(input = "chapter1.Rmd", input = "chapter2.Rmd", output_format = "pdf_document")không.

Tại sao tôi muốn làm điều này? Để chia nhỏ một tài liệu khổng lồ thành các tệp logic.

Tôi đã sử dụng gói bookdown của @hadley để xây dựng latex từ .Rmd nhưng điều này có vẻ như quá mức cần thiết cho tác vụ cụ thể này. Có giải pháp đơn giản nào bằng cách sử dụng dòng lệnh precisiontr / pandoc / linux mà tôi đang thiếu không? Cảm ơn.


1
Tại sao không chỉ viết nguyên bản trong LaTeX? Có vẻ như tất cả các công cụ bạn cần cho việc này đều được tích hợp sẵn trong LaTeX và dù sao thì quá trình đan cũng chạy tài liệu của bạn thông qua một công cụ TeX.
Thomas

13
Có Tôi thích latex và cần phải nhúng mã vào đó để đó là một kế hoạch tốt B. Làm việc trên giải pháp R với chức năng read / writeLines ATM vì tôi tin rằng Markdown là tương lai thân thiện với người dùng! arxiv.org/abs/1402.1894 Đó là một quyết định mang tính triết học: hãy là sự thay đổi bạn muốn thấy trên thế giới.
RobinLovelace

2
Ngoài ra, viết dưới dạng đánh dấu giảm rào cản để tham gia đóng góp. Cuối cùng nó sẽ là LaTeX, nhưng trong thời gian này, việc đánh dấu là đủ.
RobinLovelace

4
Cuốn sách của hadley hiện đang được phát triển bởi @yihui và đã có nhiều công việc bổ sung cũng như tài liệu hữu ích: rstudio.github.io/bookdown
Ben

Câu trả lời:


138

Cập nhật tháng 8 năm 2018: Câu trả lời này được viết trước khi xuất hiện bookdown , đây là một cách tiếp cận mạnh mẽ hơn để viết sách dựa trên Rmarkdown. Hãy xem ví dụ về bookdown tối thiểu trong câu trả lời của @ Mikey-Harper !

Khi tôi muốn chia một báo cáo lớn thành các Rmd riêng biệt, tôi thường tạo một Rmd mẹ và bao gồm các chương dưới dạng con. Cách tiếp cận này rất dễ hiểu đối với người dùng mới và nếu bạn bao gồm mục lục (toc), bạn sẽ dễ dàng điều hướng giữa các chương.

report.Rmd

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

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

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

chap1.Rmd

# Chapter 1

This is chapter 1.

```{r}
1
```

chap2.Rmd

# Chapter 2

This is chapter 2.

```{r}
2
```

Xây dựng

rmarkdown::render('report.Rmd')

Sản xuất: Báo cáo của tôi

Và nếu bạn muốn một cách nhanh chóng để tạo các phần cho tài liệu con của bạn:

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

Nó hoạt động, nhưng tôi có 10 chương. Khi tôi kết xuất các tệp, nó sẽ chuyển đến tệp thứ 5. Tôi có thể xem tất cả các tiêu đề từ bảng điều hướng PDF nhưng các trang không được hiển thị.
Tiến sĩ Suat Atan

26

Tôi khuyên mọi người nên sử dụng gói bookdown để tạo báo cáo từ nhiều tệp R Markdown. Nó bổ sung rất nhiều tính năng hữu ích như tham chiếu chéo, rất hữu ích cho các tài liệu dài hơn.

Điều chỉnh ví dụ từ @Eric , đây là một ví dụ tối thiểu về thiết lập bookdown . Chi tiết chính là tệp chính phải được gọi index.Rmdvà phải bao gồm dòng YAML bổ sung site: bookdown::bookdown_site:

index.Rmd

---
title: "A Minimal bookdown document"
site: bookdown::bookdown_site
output:
  bookdown::pdf_document2:
    toc: yes
---

01-giới thiệu. Rmd :

# Chapter 1

This is chapter 1.

```{r}
1
```

02-giới thiệu. Rmd :

# Chapter 2

This is chapter 2.

```{r}
2
```

Nếu chúng ta Knit, index.Rmd bookdown sẽ hợp nhất tất cả các tệp trong cùng một thư mục theo thứ tự bảng chữ cái (hành vi này có thể được thay đổi bằng cách sử dụng một _bookdown.ymltệp bổ sung ).

nhập mô tả hình ảnh ở đây

Khi bạn cảm thấy thoải mái với thiết lập cơ bản này, bạn có thể dễ dàng tùy chỉnh tài liệu sổ xuống và định dạng đầu ra bằng cách sử dụng các tệp cấu hình bổ sung, tức là _bookdown.yml_output.yml

Đọc thêm


có thể hiển thị các tệp Rmd ​​lồng nhau theo cách này không? làm sao? Tôi muốn có Rmd duy nhất cho mỗi phần tử trong một chương .
jangorecki

bookdown thường khuyến nghị mỗi tệp chứa một chương. Tuy nhiên, có thể chia thành các tệp riêng biệt nếu muốn. Cách đơn giản nhất sẽ được cung cấp cho mỗi tập tin với một số chỉ số như 1-1, 1-2, 1-3, vv
Michael Harper

Tôi đã cố gắng thêm phụ lục ở cuối hiển thị mã cho cả hai tài liệu. Làm thế nào tôi có thể đạt được?
Naveen Gabriel

Đây dường như là một câu hỏi khác biệt. Bạn có thể muốn mở một câu hỏi khác và cung cấp một ví dụ hoàn chỉnh mà tôi sẽ cố gắng hết sức để trả lời :)
Michael Harper

Làm rõ: Knit chỉ xem trước tài liệu hiện tại, trong khi "Xây dựng sách" xây dựng tất cả.
Rasmus Larsen

4

Điều này đã làm việc cho tôi:

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

Hãy tưởng tượng có một giải pháp tốt hơn và sẽ thật tuyệt nếu có một cái gì đó như thế này trong các gói rmarkdown hoặc hunter.


9
Tôi nghĩ rằng đây là một giải pháp hợp lý, trừ trường hợp bạn quên một vài dấu ngoặc đơn (và thụt đầu dòng !! :)
Yihui Xie
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.