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

102

У меня есть два файла в одной папке: 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
13
Да, мне нравится латекс, и мне нужно встраивать в него код, так что это хороший план Б. Работа над решением R с функцией чтения / записи ATM, потому что я считаю, что Markdown - это удобное для пользователя будущее! arxiv.org/abs/1402.1894 Т.е. это философское решение: будь тем изменением, которое ты хочешь увидеть в мире.
RobinLovelace
2
Кроме того, использование уценки снижает барьер для входа в систему. В конечном итоге это будет LaTeX, но пока достаточно уценки.
RobinLovelace
4
Книга Хэдли сейчас разрабатывается @yihui, и в ней было много дальнейшей работы и полезной документации: rstudio.github.io/bookdown
Бен

Ответы:

140

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

Когда я хочу разбить большой отчет на отдельный 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'}
# ```
Эрик
источник
Это работает, но у меня есть 10 глав. Когда я визуализирую файлы, получается 5-й файл. Я вижу все заголовки на панели навигации PDF, но страницы не отображаются.
Суат Атан, доктор философии,
26

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

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

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

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

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

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

Майкл Харпер
источник
можно ли таким образом рендерить вложенные файлы Rmd? как? Я хотел бы иметь один Rmd для каждого элемента в главе .
jangorecki
bookdown обычно рекомендует, чтобы каждый файл содержал одну главу. Однако при желании должна быть возможность разбить на отдельные файлы. Самый простой способ - предоставить каждому файлу числовой индекс, например 1-1, 1-2, 1-3 и т. Д.
Майкл Харпер,
Я пытался добавить приложение в конце, которое показывает код для обоих документов. Как я могу достичь?
Навин Габриэль
Это кажется совершенно другим вопросом. Вы можете открыть другой вопрос и предоставить полный пример, на который я постараюсь ответить
Майкл Харпер
Уточнение: Knit только предварительно просматривает текущий документ, а "Build book" строит все.
Расмус Ларсен,
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