Як об’єднати два файли RMarkdown (.Rmd) в один вихід?


100

У мене є два файли в одній папці: chapter1.Rmd і chapter2.Rmd, із таким вмістом:

Розділ 1. Rmd

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

## This is chapter 1. {#Chapter1}

Next up: [chapter 2](#Chapter2)

Розділ 2. 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 для створення латексу з .Rmd, але це здається надмірним для цього конкретного завдання. Чи є просте рішення за допомогою командного рядка knitr / pandoc / linux, якого мені не вистачає? Дякую.


1
Чому б просто не писати рідно на LaTeX? Здається, всі необхідні для цього інструменти вбудовані в LaTeX, і процес в’язання все одно запускає ваш документ через механізм TeX.
Томас

13
Так, мені подобається латекс, і мені потрібно зайнятися вбудовуванням коду в нього, тому це хороший план Б. Робота над рішенням R із функцією ATM з функцією read / writeLines, оскільки я вважаю, що Markdown - це зручне майбутнє! arxiv.org/abs/1402.1894 Тобто це філософське рішення: будь змін, які ти хочеш бачити у світі.
RobinLovelace

2
Крім того, написання як знижка зменшує бар'єр для вступу до внеску. Врешті-решт це буде LaTeX, але наразі достатньої націнки.
RobinLovelace

4
книга Хадлі зараз розробляється @yihui і мала ще багато роботи та корисної документації: rstudio.github.io/bookdown
Бен,

Відповіді:


138

Оновлення від серпня 2018 р. Ця відповідь була написана до появи bookdown , що є більш потужним підходом до написання книг на основі Rmarkdown. Перевірте мінімальний bookdown приклад @ Mikey-Харпер відповіді !

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

звіт

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

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

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

Розділ 1. Rmd

# Chapter 1

This is chapter 1.

```{r}
1
```

Розділ 2. 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 , ось мінімальний приклад налаштування книги . Основна деталь полягає в тому, що основний файл повинен бути викликаний index.Rmdі повинен містити додатковий рядок YAML site: bookdown::bookdown_site:

індекс.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 і вихідні формати , використовуючи додаткові конфігураційні файли , тобто _bookdown.ymlі_output.yml

Подальше читання


чи можна зробити вкладені Rmd-файли таким чином? як? Я хотів би мати одиничний Rmd для кожного елемента в главі .
jangorecki

bookdown зазвичай рекомендує, щоб кожен файл містив одну главу. Однак при бажанні має бути можливість розділити на окремі файли. Найпростіший спосіб - надати кожному файлу числовий індекс, такий як 1-1, 1-2, 1-3 тощо
Майкл Харпер

Я намагався додати додаток в кінці, який показує код для обох документів. Як я можу досягти?
Naveen Gabriel

Це здається зовсім іншим питанням. Можливо, ви захочете відкрити ще одне запитання та навести повний приклад, на який я постараюся відповісти з
Майкл Харпер

Уточнення: Knit лише попередньо переглядає поточний документ, тоді як "Створення книги" - це все.
Расмус Ларсен,

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.