Подтвердить что ты не робот

Как объединить два файла 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") не работает.

Почему я хочу это сделать? Разбить гигантский документ на логические файлы.

Я использовал пакет @hadley bookdown для сборки латекса с .Rmd, но это похоже на излишнюю проблему для этой конкретной задачи. Есть ли простое решение с использованием командной строки knitr/pandoc/linux? Спасибо.

4b9b3361

Ответ 1

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

Когда я хочу разбить большой отчет на отдельный 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')

Что производит: My report

И если вы хотите быстро создать куски для ваших дочерних документов:

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

Ответ 2

Я бы рекомендовал, чтобы люди использовали пакет 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).

enter image description here

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

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

Ответ 3

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

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.