Как объединить два файла RMarkdown (.Rmd) в один вывод?

У меня есть два файла в одной папке: 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? Благодарю.

Обновление в августе 2018 года: этот ответ был написан до появления bookdown , который является более мощным подходом к написанию книг Rmarkdown. Ознакомьтесь с минимальным примером книги в ответе @ Майки-Харпера!

Когда я хочу разбить большой отчет на отдельный Rmd, я обычно создаю родительский Rmd и включаю главы как дети. Этот подход легко понять новым пользователям, и если вы включите оглавление (toc), легко перемещаться между главами.

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

строить

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

Я бы рекомендовал, чтобы люди использовали пакет bookdown для создания отчетов из нескольких файлов R Markdown. Он добавляет множество полезных функций, таких как перекрестные ссылки, которые очень полезны для более длинных документов.

Адаптируя пример из @Eric , вот минимальный пример настройки bookdown . Основная деталь заключается в том, что главный файл должен быть назван index.Rmd и должен включать дополнительный site: bookdown::bookdown_site линии 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 ``` 

Если мы index.Rmd bookdown, мы объединим все файлы в том же каталоге в алфавитном порядке (это поведение можно изменить с помощью дополнительного файла _bookdown.yml ).

введите описание изображения здесь

После того, как вы освоите эту базовую настройку, легко настроить документ и вывести форматы с помощью дополнительных файлов конфигурации, т.е. _bookdown.yml и _output.yml

Дальнейшее чтение

  • R Markdown: окончательное руководство : глава 11 дает отличный обзор оформления книги
  • Авторские книги с книжной книгой содержат исчерпывающее руководство по оформлению книги и рекомендуются для более подробной информации.

Это сработало для меня:

 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.

Давайте будем гением компьютера.