Как объединить два файла 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? Спасибо.
Ответы
Ответ 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.