Как да комбинирам два 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, което ми липсва? Благодаря.


person RobinLovelace    schedule 13.09.2014    source източник
comment
Защо просто не пишете нативно в LaTeX? Изглежда, че всички инструменти, от които се нуждаете за това, са вградени в LaTeX и процесът на плетене така или иначе изпълнява вашия документ през TeX двигател.   -  person Thomas    schedule 13.09.2014
comment
Да, харесвам латекса и трябва да започна да вграждам код в него, така че това е добър план Б. Работя върху R решение с ATM функция за четене/записLines, защото вярвам, че Markdown е удобното за потребителя бъдеще! arxiv.org/abs/1402.1894 Т.е. това е философско решение: бъди промяната, която искаш да видиш в света.   -  person RobinLovelace    schedule 13.09.2014
comment
Също така, писането като маркдаун намалява бариерата за навлизане в принос. В крайна сметка ще бъде LaTeX, но за момента маркдаунът е достатъчен.   -  person RobinLovelace    schedule 13.09.2014
comment
bookdown на hadley сега се разработва от @yihui и има много допълнителна работа и полезна документация: rstudio.github. io/bookdown   -  person Ben    schedule 05.01.2016


Отговори (3)


Актуализация от август 2018 г.: Този отговор е написан преди появата на bookdown, което е по-мощен подход за писане на книги, базирани на Rmarkdown. Вижте минималния пример за bookdown в отговора на @Mikey-Harper!

Когато искам да разделя голям отчет на отделни Rmd, обикновено създавам родителски Rmd и включвам главите като деца. Този подход е лесен за разбиране от новите потребители и ако включите съдържание (toc), можете лесно да навигирате между главите.

доклад.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'}
# ```
person Eric    schedule 22.09.2014
comment
Работи, но имам 10 глави. Когато изобразявам файловете, той отива до 5-ти файл. Виждам всички заглавия от панела за навигация на PDF, но страниците не се показват. - person Suat Atan PhD; 22.05.2015

Бих препоръчал на хората да използват пакета 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
```

Ако плетем, index.Rmd bookdown ще обедини всички файлове в една и съща директория по азбучен ред (това поведение може да се промени с помощта на допълнителен _bookdown.yml файл).

въведете описание на изображението тук

След като се запознаете с тази основна настройка, е лесно да персонализирате документа на bookdown и изходните формати, като използвате допълнителни конфигурационни файлове, т.е. _bookdown.yml и _output.yml

Допълнителна литература

person Michael Harper    schedule 25.07.2018
comment
възможно ли е да се рендират вложени Rmd файлове по този начин? как Бих искал да имам един Rmd за всеки елемент в глава. - person jangorecki; 23.08.2018
comment
bookdown обикновено препоръчва всеки файл да съдържа една глава. Въпреки това трябва да е възможно да се разделят на отделни файлове, ако желаете. Най-лесният начин би бил да предоставите на всеки файл цифров индекс като 1-1, 1-2, 1-3 и т.н. - person Michael Harper; 23.08.2018
comment
Опитвах се да добавя приложение в края, което показва кода и за двата документа. Как мога да постигна? - person Naveen Gabriel; 05.02.2019
comment
Това изглежда като различен въпрос. Може да искате да отворите друг въпрос и да предоставите пълен пример, на който ще се постарая да отговоря :) - person Michael Harper; 05.02.2019
comment
Пояснение: Knit само визуализира текущия документ, докато Build book го изгражда целия. - person Rasmus Larsen; 24.06.2020

Това проработи за мен:

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.

person RobinLovelace    schedule 13.09.2014
comment
Мисля, че това е разумно решение, освен че сте забравили няколко скоби (и отстъп!! :) - person Yihui Xie; 17.09.2014