knitr 1.6 新しいレンダリングのカスタマイズ方法

シリーズ Useful R 9巻「ドキュメント・プレゼンテーション生成」のサプリメントです。 knitr 1.6で新たに導入されたレンダリングの仕組みについて説明します。

シリーズ Useful R / ドキュメント・プレゼンテーション生成 / Amazon

サポートサイト


knitr 1.5以前までは、出力結果をフックにより変更することができました。 knitr 1.6では、レンダリング自体をカスタマイズする方法が提供されています。

フックの場合、レンダリングされた結果(文字列)に対する変更でした。 レンダリングをカスタマイズする場合は、レンダリング対象のオブジェクトにアクセスできます。 この方法で、例えばmatrixを表出力関数(kableなど)でレンダリングする、という動作をデフォルトとすることができます。

レンダリングのカスタマイズには以下の2種類の方法があります。

S3メソッドの利用

# 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!!