16.4 子文書 (*)

R Markdown 文書が長過ぎると思った時は, 短い文書に分割することも考えると. そして, チャンクオプション child を使ってメイン文書に子文書として読み込ませましょう. child オプションは子文書のファイルパスを文字列ベクトルとして取ります. 例えばこのように.

```{r, child=c('one.Rmd', 'two.Rmd')}
```

knitr のチャンクオプションは任意の R コードから値を取ることができるので, child オプションの応用として条件付で文書を読み込ませる方法があります. 例えばあなたのレポートの中に, 上司が関心を持たないような技術的に詳細な補足文書があるなら, この変数を使えばその補足文書をレポートに含むかどうかを制御できます.

あなたのボスにレポートを読ませるなら `BOSS_MODE``TRUE` に変える

```{r, include=FALSE}
BOSS_MODE <- FALSE
```

条件付きで補足文書を読み込む

```{r, child=if (!BOSS_MODE) 'appendix.Rmd'}
```

あるいはまだ始まってないフットボールの試合の速報レポートを書いているなら, 試合結果に応じて異なる子文書を読み込むようにすることもできます. 例えば child = if (winner == 'ブラジル') 'ブラジル.Rmd' else 'ドイツ.Rmd' のように. これで試合 (ここではドイツ対ブラジル) が終わり次第すぐに, レポートを提出できます.

子文書をコンパイルする別の方法として, knitr::knit_child() 関数があります. この関数は R コードチャンク内部またはインライン R コードで呼び出せます. 例えばこのように.

```{r, echo=FALSE, results='asis'}
res <- knitr::knit_child('child.Rmd', quiet = TRUE)
cat(res, sep = '\n')
```

knit_child() 関数は knit された子文書の文字列ベクトルを返します. これは cat() とチャンクオプション results = "asis" を使ってメインの文書に還元することができます.

テンプレートとして子文書を使うこともできますし, 毎回異なるパラメータを与えつつ何度でも knit_child() を呼び出すこともできます. 以下の例では mtcars データの mpg を従属変数, そして残りの変数を説明変数として使った回帰分析を実行しています.

```{r, echo=FALSE, results='asis'}
res <- lapply(setdiff(names(mtcars), 'mpg'), function(x) {
  knitr::knit_child(text = c(
    '## "`r x`" への回帰',
    '',
    '```{r}',
    'lm(mpg ~ ., data = mtcars[, c("mpg", x)])',
    '```',
    ''
  ), envir = environment(), quiet = TRUE)
})
cat(unlist(res), sep = '\n')
```

上記の例を自己完結的なものにするために, knit_child() にファイルを入力するのではなく text 引数に R Markdown コンテンツを渡しました. もちろんファイルにコンテンツを書き出し, knit_child() にファイルパスを渡すこともできます. 例えば以下のコンテンツを template.Rmd という名前のファイルに保存します.

## "`r x`" への回帰

```{r}
lm(mpg ~ ., data = mtcars[, c("mpg", x)])
```

そして代わりにファイルを knit します.

res <- lapply(setdiff(names(mtcars), 'mpg'), function(x) {
  knitr::knit_child(
    'template.Rmd', envir = environment(), quiet = TRUE
  )
})
cat(unlist(res), sep = '\n')