13.4 出力にチャンクヘッダを表示する

読者に元のチャンクヘッダのコードを表示したい時もあるかもしれません. 例えば R Markdown のチュートリアルを書いていて, チャンクの出力とその出力を生成するのに使用したチャンクオプションの両方を表示すれば, 読者が自分で同じことをする方法を学ぶことができるというわけです.

元のチャンクオプションは実際にはチャンクオプションの params.scr 内に文字列として保存されています. これを知ったあなたは params.src を出力するチャンクフックを書くこともできます. 以下はその完全な例です.

---
title: 出力にチャンクヘッダを表示する
---

本来のチャンクヘッダとフッタの内側にチャンクを出力する
`wrapper` という名前のチャンクフックを用意します.

```{r, setup, include=FALSE}
knitr::knit_hooks$set(wrapper = function(before, options) {
  # 本来のチャンクはインデントされる
  if (is.null(indent <- options$indent)) indent <- ''
  
  # wrapper=TRUE オプションを隠す
  opts <- gsub(', wrapper=TRUE', '', options$params.src)
  
  if (before) {
    # ヘッダを追加する
    sprintf('\n\n%s````\n```{r,%s}\n````\n', indent, opts)
  } else {
    # フッタを追加する
    sprintf('\n\n%s````\n```\n````\n', indent)
  }
})
```

ここでチャンクオプション `wrapper=TRUE`  でフックを適用します. `wrapper=TRUE` をヘッダの最後に置くことと, 正確に `wrapper=TRUE` でなければならず, 上記で呼び出されている `gsub()` を修正しない限り, 例えば `wrapper=T` はダメで,  コンマとスペースの後に続けなければならないことも忘れないでください.

```{r, test-label, collapse=TRUE, wrapper=TRUE}
1 + 1
plot(cars)
```

本来のチャンクヘッダが出力に現れるはずです. フックはチャンクがインデントされていても動作するはずです. これが例です.

- 箇条書きその1

  ```{r, eval=TRUE, wrapper=TRUE}
  2 + 2
  ```

- もう1つ箇条書き

基本的には, options$params.src から取り出したチャンクヘッダを ```{r, } の中に入れることで元のヘッダを再現しています. そしてこの行を1組の4連続バッククオートで囲んでいるので, 出力時にはそのまま表示されます. 本来のコードチャンクはインデントされているかもしれない (例: 箇条書き内にネストされている場合)ので, 適切にインデントを追加することも必要になります. これはチャンクオプション options$indent に保存されています.

上記の例の最後の, 箇条書き内の出力はこのようになります.

  • 箇条書きその1

    ```{r, eval=TRUE}
    2 + 2
    ## [1] 4
    ```
  • もう1つ箇条書き

コードチャンクが評価され, チャンクヘッダも追加されていることが分かったかと思います.