web-dev-qa-db-ja.com

2つのRMarkdown(.Rmd)ファイルを単一の出力に結合する方法は?

同じフォルダーにchapter1.Rmdとchapter2.Rmdの2つのファイルがあり、次の内容が含まれています。

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")は機能しません。

なぜこれをしたいのですか? 巨大文書 を論理ファイルに分割します。

@hadleyの bookdown パッケージを使用して.Rmdからlatexをビルドしましたが、これはこの特定のタスクには過剰すぎるようです。不足しているknitr/pandoc/linuxコマンドラインを使用した簡単な解決策はありますか?ありがとう。

78
RobinLovelace

2018年8月更新:この回答は、bookdownの出現前に書かれました、Rmarkdownベースの本を書くためのより強力なアプローチです。 @ Mikey-Harperの answer !の最小bookdownの例を確認してください。

大きなレポートを個別の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')

生成するもの: My report

子ドキュメントのチャンクをすばやく作成する方法が必要な場合:

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

複数のR Markdownファイルからレポートを作成するには、bookdownパッケージを使用することをお勧めします。相互参照のような、より長いドキュメントに非常に役立つ多くの便利な機能が追加されます。

@ 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.Rmdbookdownは、同じディレクトリ内のすべてのファイルをアルファベット順にマージします(この動作は、追加の_bookdown.ymlファイル)。

enter image description here

この基本的な設定に慣れたら、追加の設定ファイルを使用してブックダウンドキュメントと出力形式を簡単にカスタマイズできます。つまり、_bookdown.ymlおよび_output.yml

さらに読む

18
Michael Harper

これは私のために働いた:

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パッケージでこのようなものを持っているといいでしょう。

4
RobinLovelace