4.19 全てのコードを補遺に置く (*)

対象読者がレポートを読む時, 計算の詳細に強く関心があるのでない限り, あなたはレポートにソースコードブロックを表示させたくないかもしれません. この用途で, チャンクオプション echo = FALSE を設定してソースコードを隠し, 読者がプログラムコードで気が散らないようにすることができます. しかしそれでも, ソースコードは再現可能性のある研究のために重要です. 読者はレポートを読み終わった後に計算の正しさを検証したいと思うかも知れません. この場合, 本文中の全てのコードブロックをまとめ, 文書の末尾 (例えば補遺として) に表示するというのは良い考えでしょう.

チャンクオプションの ref.labelknitr::all_labels() 関数を使い, 文書内の全てのコードチャンクを取り出して1つのコードチャンクにまとめる簡単な方法があります. 例えばこのように.

# 補遺: 本稿で使ったコード全文

```{r ref.label=knitr::all_labels(), echo=TRUE, eval=FALSE}
```

チャンクオプション ref.label について詳しく知らないならば, 14.1.3節を読んでください.

knitr::all_labels() 関数は文書内の全てのチャンクラベルを返すため, ref.label = knitr::all_labels() は全てのソースコードチャンクを回収しこのチャンクに持ってくることを意味します. チャンクオプション echo = TRUE (コードを表示させる) と eval = FALSE (全てのコードはすでに実行されているため, このコードチャンクは実行してはいけません) を付与すれば, 1つのコードチャンクに全てのソースコードのコピーを表示させられます.

ref.label は任意のチャンクラベルの文字列ベクトルであるため, 補遺に表示するコードチャンクを一部だけにするようにラベルをフィルタリングできます. 以下はその例 (Ariel Muldoon によるものです) として setupget-labels というラベルを排除しています.

```{r get-labels, echo = FALSE}
labs = knitr::all_labels()
labs = setdiff(labs, c("setup", "get-labels"))
```

```{r all-code, ref.label=labs, eval=FALSE}
```

knitr::all_labels() の引数を使ってコードチャンクをフィルタリングできます. 例えば Rcpp エンジン (engine == "Rcpp") を使用した全てのコードチャンクを得て, かつ文書に表示しない (echo = FALSE) ようにするには knitr::all_labels(engine == "Rcpp", echo == FALSE) を使えます. どのコードチャンクを補遺に表示したいのか, 正確にコントロールしたいならば, 指定したいコードチャンクに特殊なチャンクオプション appendix = TRUE を使い, それらのチャンクのラベルを得るのに ref.label = knitr::all_labels(appendix == TRUE) を使えます.