İki RMarkdown (.Rmd) dosyası tek bir çıktıda nasıl birleştirilir?


104

Aynı klasörde iki dosyam var: aşağıdaki içeriğe sahip bölüm1.Rmd ve bölüm2.Rmd:

Bölüm1.Rmd

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

## This is chapter 1. {#Chapter1}

Next up: [chapter 2](#Chapter2)

Bölüm2.Rmd

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

## This is chapter 2. {#Chapter2}

Previously: [chapter 1](#Chapter1)

Bunları tek bir pdf çıktısında birleşecek şekilde nasıl örebilirim?

Elbette render(input = "chapter1.Rmd", output_format = "pdf_document")mükemmel çalışıyor ama render(input = "chapter1.Rmd", input = "chapter2.Rmd", output_format = "pdf_document")yaramıyor.

Bunu neden yapmak istiyorum? Dev bir belgeyi mantıksal dosyalara bölmek için .

@Hadley'in bookdown paketini .Rmd'den lateks oluşturmak için kullandım, ancak bu, bu belirli görev için aşırıya kaçmış gibi görünüyor. Eksik olduğum knitr / pandoc / linux komut satırını kullanan basit bir çözüm var mı? Teşekkürler.


1
Neden LaTeX'te yerel olarak yazmıyorsunuz? Görünüşe göre bunun için ihtiyacınız olan tüm araçlar LaTeX'te yerleşiktir ve örgü işlemi belgenizi yine de bir TeX motoru aracılığıyla çalıştırır.
Thomas

14
Evet, lateksi seviyorum ve içine kodu yerleştirmem gerekiyor, bu yüzden bu iyi bir plan B. Read / writeLines işlevi ATM'ye sahip bir R çözümü üzerinde çalışmak, çünkü Markdown'un kullanıcı dostu bir gelecek olduğuna inanıyorum! arxiv.org/abs/1402.1894 Yani bu felsefi bir karar: dünyada görmek istediğiniz değişim olun.
RobinLovelace

2
Ayrıca, indirgeme olarak yazmak, katkıda bulunmanın önündeki engelleri azaltır. Sonunda LaTeX olacak, ancak şimdilik indirim yeterli.
RobinLovelace

4
hadley'in bookdown şu anda @yihui tarafından geliştiriliyor ve daha birçok iş ve faydalı dokümantasyona sahip: rstudio.github.io/bookdown
Ben

Yanıtlar:


143

Ağustos 2018 güncellemesi: Bu cevap, Rmarkdown tabanlı kitaplar yazmak için daha güçlü bir yaklaşım olan bookdown'un gelişinden önce yazılmıştır . Minimal göz atın bookdown Mikey-Harper @ örneğe cevap !

Büyük bir raporu ayrı bir Rmd'ye bölmek istediğimde, genellikle bir ana Rmd oluşturur ve bölümleri çocuk olarak eklerim. Bu yaklaşım, yeni kullanıcıların anlaması kolaydır ve bir içindekiler tablosu (toc) eklerseniz, bölümler arasında gezinmek kolaydır.

report.Rmd

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

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

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

Bölüm1.Rmd

# Chapter 1

This is chapter 1.

```{r}
1
```

Bölüm2.Rmd

# Chapter 2

This is chapter 2.

```{r}
2
```

İnşa etmek

rmarkdown::render('report.Rmd')

Hangi üretir: Benim raporum

Ve alt belgeleriniz için yığınlar oluşturmanın hızlı bir yolunu istiyorsanız:

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'}
# ```

Çalışıyor ama 10 bölümüm var. Dosyaları render ettiğimde 5. dosyaya çıkıyor. PDF gezinme panelinden tüm başlıkları görebiliyorum, ancak sayfalar gösterilmiyor.
Suat Atan PhD

28

İnsanların birden çok R Markdown dosyasından raporlar oluşturmak için bookdown paketini kullanmalarını tavsiye ederim . Daha uzun belgeler için çok yararlı olan çapraz referans gibi birçok yararlı özellik ekler.

Örneği @Eric'ten uyarlayarak , aşağıda yer ayırma kurulumunun minimal bir örneğini bulabilirsiniz . Ana ayrıntı, ana dosyanın çağrılması index.Rmdve ek YAML satırını içermesidir site: bookdown::bookdown_site:

index.Rmd

---
title: "A Minimal bookdown document"
site: bookdown::bookdown_site
output:
  bookdown::pdf_document2:
    toc: yes
---

01-giriş.Rmd :

# Chapter 1

This is chapter 1.

```{r}
1
```

02-giriş.Rmd :

# Chapter 2

This is chapter 2.

```{r}
2
```

Biz Örme Eğer index.Rmd bookdown alfabetik aynı dizindeki tüm dosyaları birleştirme (bu davranış ekstra kullanılarak değiştirilebilir _bookdown.ymldosyası).

görüntü açıklamasını buraya girin

Eğer bu temel kurulum ile rahat olsun, ek yapılandırma dosyaları yani kullanarak bookdown belgesi ve çıkış biçimlerini özelleştirmek kolaydır _bookdown.ymlve_output.yml

Daha fazla okuma


yuvalanmış Rmd dosyalarını bu şekilde işlemek mümkün mü? Nasıl? Bir bölümdeki her eleman için tek bir Rmd'ye sahip olmak istiyorum .
jangorecki

bookdown genellikle her dosyanın bir bölüm içermesini önerir. Ancak istenirse ayrı dosyalara bölmek mümkün olmalıdır. En kolay yol, her dosyaya 1-1, 1-2, 1-3 vb. Gibi sayısal bir dizin sağlamaktır.
Michael Harper

Her iki belge için kodu gösteren sonuna ek eklemeye çalışıyordum. Nasıl başarabilirim?
Naveen Gabriel

Bu, farklı bir soru gibi görünüyor. Başka bir soru açmak ve cevaplamak için elimden gelenin en iyisini yapacağım eksiksiz bir örnek vermek isteyebilirsiniz :)
Michael Harper

Açıklama: Knit yalnızca geçerli belgenin önizlemesini görüntülerken, "Kitap oluştur" hepsini oluşturur.
Rasmus Larsen

4

Bu benim için çalıştı:

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

Daha iyi bir çözüm olduğunu hayal edin ve rmarkdown veya örme paketlerde buna benzer bir şeye sahip olmak güzel olurdu.


9
Birkaç parantezi (ve girintiyi !! :) unutmanız dışında, bunun makul bir çözüm olduğunu düşünüyorum
Yihui Xie
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.