Como combinar dois arquivos RMarkdown (.Rmd) em uma única saída?

100

Tenho dois arquivos na mesma pasta: capítulo1.Rmd e capítulo2.Rmd, com o seguinte conteúdo:

capítulo1.Rmd

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

## This is chapter 1. {#Chapter1}

Next up: [chapter 2](#Chapter2)

capítulo2.Rmd

---
title: "Chapter 2"
output: pdf_document
---

## This is chapter 2. {#Chapter2}

Previously: [chapter 1](#Chapter1)

Como posso tricotá-los para que se combinem em uma única saída de PDF?

Claro, render(input = "chapter1.Rmd", output_format = "pdf_document")funciona perfeitamente, mas render(input = "chapter1.Rmd", input = "chapter2.Rmd", output_format = "pdf_document")não funciona.

Por que eu quero fazer isso? Para quebrar um documento gigante em arquivos lógicos.

Eu usei @hadley 's bookdown pacote ao látex construção de .RMD mas este parece ser um exagero para esta tarefa particular. Existe uma solução simples usando a linha de comando knitr / pandoc / linux que estou perdendo? Obrigado.

RobinLovelace
fonte
1
Por que não escrever nativamente em LaTeX? Parece que todas as ferramentas de que você precisa para isso estão incorporadas ao LaTeX e o processo de tricô executa seu documento por meio de um mecanismo TeX de qualquer maneira.
Thomas
13
Sim, eu gosto de latex e preciso incorporar código a ele, então esse é um bom plano B. Trabalhar em uma solução R com a função read / writeLines ATM porque acredito que Markdown é o futuro amigável! arxiv.org/abs/1402.1894 Ou seja, é uma decisão filosófica: seja a mudança que você deseja ver no mundo.
RobinLovelace
2
Além disso, escrever como remarcação reduz a barreira de entrada para contribuir. Eventualmente será LaTeX, mas por enquanto a redução é suficiente.
RobinLovelace
4
O bookdown do hadley agora está sendo desenvolvido por @yihui e teve muito trabalho adicional e documentação útil: rstudio.github.io/bookdown
Ben

Respostas:

138

Atualização de agosto de 2018: esta resposta foi escrita antes do advento do bookdown , que é uma abordagem mais poderosa para escrever livros baseados em Rmarkdown. Confira o mínimo bookdown exemplo, em @ Mikey-Harper resposta !

Quando desejo dividir um relatório grande em Rmd separado, geralmente crio um Rmd pai e incluo os capítulos como filhos. Essa abordagem é fácil de entender para novos usuários e, se você incluir um índice (toc), é fácil navegar entre os capítulos.

report.Rmd

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

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

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

capítulo1.Rmd

# Chapter 1

This is chapter 1.

```{r}
1
```

capítulo2.Rmd

# Chapter 2

This is chapter 2.

```{r}
2
```

Construir

rmarkdown::render('report.Rmd')

Que produz: Meu relatório

E se você quiser uma maneira rápida de criar os pedaços para seus documentos filho:

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'}
# ```
Eric
fonte
Funciona, mas tenho 10 capítulos. Quando eu renderizo os arquivos, ele vai para o quinto arquivo. Posso ver todos os títulos do painel de navegação do PDF, mas as páginas não são mostradas.
Suat Atan PhD
26

Eu recomendo que as pessoas usem o pacote bookdown para criar relatórios de vários arquivos R Markdown. Ele adiciona muitos recursos úteis, como referência cruzada, que são muito úteis para documentos mais longos.

Adaptando o exemplo de @Eric , aqui está um exemplo mínimo de configuração de bookdown . O detalhe principal é que o arquivo principal deve ser chamado index.Rmde deve incluir a linha YAML adicional 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
```

Se fizermos Knit, o index.Rmd bookdown irá mesclar todos os arquivos no mesmo diretório em ordem alfabética (este comportamento pode ser alterado usando um _bookdown.ymlarquivo extra ).

insira a descrição da imagem aqui

Uma vez que você se sentir confortável com esta configuração básica, é fácil de personalizar o documento bookdown e formatos de saída usando arquivos de configuração adicionais, ou seja, _bookdown.ymle_output.yml

Leitura Adicional

Michael Harper
fonte
é possível renderizar arquivos Rmd aninhados dessa maneira? como? Eu gostaria de ter Rmd único para cada elemento em um capítulo .
jangorecki
O bookdown geralmente recomenda que cada arquivo contenha um capítulo. No entanto, deve ser possível dividir em arquivos separados, se desejado. A maneira mais fácil seria fornecer a cada arquivo um índice numérico, como 1-1, 1-2, 1-3 etc.
Michael Harper
Eu estava tentando adicionar um apêndice no final que mostra o código para ambos os documentos. Como posso alcançar?
Naveen Gabriel
Esta parece ser uma questão diferente. Você pode querer abrir outra pergunta e fornecer um exemplo completo que tentarei responder da melhor maneira possível :)
Michael Harper
Esclarecimento: o Knit apenas mostra o documento atual, enquanto "Construir livro" cria tudo.
Rasmus Larsen
4

Isso funcionou para mim:

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)
    }

Imagine que há uma solução melhor e seria bom ter algo assim nos pacotes rmarkdown ou knitr.

RobinLovelace
fonte
9
Acho que esta é uma solução razoável, exceto que você esqueceu alguns parênteses (e recuo !! :)
Yihui Xie