11.17 チャンク内のオブジェクト表示をカスタマイズする (*)

デフォルトではコードチャンク内のオブジェクトは knitr::knit_print() 関数を通して表示され, これは概ね base R の print() と同じです. knit_print() 関数は S3 ジェネリック関数であり, 自分で S3 メソッドを登録して機能を拡張できることを意味します. 以下は knitr::kable() でデータフレームを表として自動表示する方法の例です.

---
title: データフレームの表示にカスタム `knit_print` メソッドを使う
---

初めに `knit_print` メソッドを定義して登録します.

```{r}
knit_print.data.frame = function(x, ...) {
  res = paste(c("", "", knitr::kable(x)), collapse = "\n")
  knitr::asis_output(res)
}

registerS3method(
  "knit_print", "data.frame", knit_print.data.frame,
  envir = asNamespace("knitr")
)
```

これでデータフレームに対するカスタム表示メソッドをテストできます. もはや `knitr::kable()` を明示的に呼ぶ必要がないことに注意してください.

```{r}
head(iris)
```

```{r}
head(mtcars)
```

knit_print() 関数の詳細は knitr パッケージのビネットから学ぶことができます.

vignette("knit_print", package = "knitr")

printr パッケージ (Xie 2021e) はいくつかの R オブジェクトを可能な範囲で自動的に表として表示する S3 メソッドをいくつか提供します. コードチャンクで library(printr) を実行するだけで十分で, 全てのメソッドが自動的に登録されます.

このテクニックがとても上級者向けだと感じたなら, html_documentpdf_document のような R Markdown の出力フォーマットに df_print オプションを与えてください. これでデータフレームの表示に関する挙動をカスタマイズできます. 例えばデータフレームを knitr::kable() で表示したいなら, このようにオプションを設定することもできます.

---
output:
  html_document:
    df_print: kable
---

出力フォーマット (?rmarkdown::html_document など)が df_print をサポートするかどうか, そこで使用可能な値が何であるかの判断は, 出力フォーマット関数のヘルプページを見てください.

実際には, render チャンクオプションで knit_print() 関数を完全に置き換えることができます. このオプションはオブジェクトを表示する任意の関数を取ることができます. 例えば pander パッケージ を使ってオブジェクトを表示したいなら, チャンクオプション renderpander::pander() を設定するとよいでしょう.

```{r, render=pander::pander}
iris
```

render オプションによって, あなたは R オブジェクトの表示方法に対する完全なる自由を手に入れるでしょう.

参考文献

———. 2021e. Printr: Automatically Print r Objects to Appropriate Formats According to the Knitr Output Format. https://yihui.org/printr/.