シリーズ Useful R 9巻「ドキュメント・プレゼンテーション生成」のサプリメントです。 knitr 1.6で新たに導入されたレンダリングの仕組みについて説明します。
シリーズ Useful R / ドキュメント・プレゼンテーション生成 / Amazon
knitr 1.5以前までは、出力結果をフックにより変更することができました。 knitr 1.6では、レンダリング自体をカスタマイズする方法が提供されています。
フックの場合、レンダリングされた結果(文字列)に対する変更でした。
レンダリングをカスタマイズする場合は、レンダリング対象のオブジェクトにアクセスできます。
この方法で、例えばmatrixを表出力関数(kableなど)でレンダリングする、という動作をデフォルトとすることができます。
レンダリングのカスタマイズには以下の2種類の方法があります。
knit_print.*を定義する。オブジェクトのクラスに対応してレンダリング方法をカスタマイズできます。renderを指定する。# hogeクラス用レンダリング関数
knit_print.hoge <- function(x, ...) {
cat("クラスhoge", "\n")
print(x)
}
# hogeクラス用レンダリング関数
knit_print.boke <- function(x, ...) {
cat("クラスboke", "\n")
print(x)
}
# matrixクラス用レンダリング関数
knit_print.matrix <- function(x, ...) {
# asis_outputでレンダリング結果のマークアップを抑制します
asis_output(paste(capture.output(kable(as.data.frame(x))), collapse = "\n"))
}
# hogeクラス
a <- 1
class(a) <- "hoge"
a
## クラスhoge
## [1] 1
## attr(,"class")
## [1] "hoge"
# bokeクラス
b <- 2
class(b) <- "boke"
b
## クラスboke
## [1] 2
## attr(,"class")
## [1] "boke"
# matrixクラス
z <- matrix(1:6, 2, 3)
z
| V1 | V2 | V3 |
|---|---|---|
| 1 | 3 | 5 |
| 2 | 4 | 6 |
renderの利用以下の様なレンダリング関数を定義して、チャンクヘッダでチャンクオプションrender=fとします。
f <- function(x, ...) {
if (is.numeric(x)) print(x+1)
else if(is.character(x)) paste(x, " orz")
else print(x)
}
こうなります。
2 + 3
## [1] 6
letters[1:5]
## a orz
## b orz
## c orz
## d orz
## e orz
Enjoy!!