Posted at

knitr の cache オプションを使いこなす

More than 5 years have passed since last update.


  • 対象読者


    • R の knitr パッケージの基本的な使い方を知っている方



  • ゴール


    • cache, dependson オプションの使い方を知ってより便利に knitr を使いこなす



この記事では,knitr のチャンクオプションでキャッシュの制御ができるので,基本的な知識と挙動や使い方について説明します.

キャッシュを使うと,つぎのようなことができます.


  • 大きな CSV ファイルを読み込むのに時間がかかるので,RData として意識することなく保持

  • 時間のかかる分析結果を保持しておいて,あとからレポート作成

この記事では,まずキャッシュを整序するためのチャンクオプションについて簡単に説明します.

そのつぎに,各オプションの挙動について説明します.

そして,実際にどのように使うと便利そうかについて説明します.


knitr のキャッシュ制御のオプション

knitr のキャッシュ関連で役に立ちそうなチャンクオプションは,つぎがあげられる.

これ以外にも幾つかキャッシュ周りのチャンクオプションはあるので,

Options: Chunk options and package options | knitr

で調べられる.

オプション

デフォルト値
説明

cache
logical or {0,1,2,3}
FALSE
コードチャンクをキャッシュ化

dependson
character or numeric
NULL
コードチャンクに依存関係を指定

autodep
logical
FALSE
グローバル変数などで依存計算がありそうなものを自動的に判定して依存関係を判定


cache オプション

コードチャンク単位として,R の変数などをキャッシュすることができます.

使いどころとしては,CSV データの読み出しや分析結果の保持などができるので knitr を再実行するときに役立ちます.

つまり,knitr で分析を進めていくときに,反復して knit2html を実行してもマイルストーンとしておくことができます.


キャッシュ化する

キャッシュを利用するときには,cache=TRUE をチャンクオプション指定することで利用できます.

デフォルトでは,FALSE になっています.

従って,キャッシュ機能は聞いていません.

` ``{r cache=TRUE}

data <- read.csv("foo.csv.gz")
` ``


キャッシュの程度を制御する

cache オプションは,TRUE に指定する以外に 0, 1, 2, 3 の値を指定することができます.

それぞれの違いについて,説明をします.

cache=0 は,cache=FALSE と同じです.

また cache=3 は,cache=TRUE と同じです.

cache=1 は,チャンク内のコードは実行はされます.

変数などのデータや計算結果は,キャッシュから読み込まれます.

しかし,プロット図の画像の新規作成・保存は行われます.

cache=2 は,挙動としては cache=1 と似ています.

唯一の違いは,プロット図の画像ファイルがすでにあったとしても上書きしないということです.

cache=1, cache=2 は基本的に利用することはなく,キャッシュが必要であれば cache=TRUE でいいと思います.

Git を使っているときなどは,画像が変更されると差分として発生することがあるので,cache=2 として使うとよいと思います.


dependson オプション

dependson オプションには,依存したい処理が別のチャンクにあるときは,そのチャンクのラベルをベクトルとして指定します.

たとえば,分析対象のデータが大きいときに,そのデータをキャッシュとして保持しています.

また,分析対象のデータに依存するような計算処理があるとします.

もし分析対象のデータを変更したら,計算処理もついづいしてキャッシュを利用せず,追随して再計算してほしいときがあります.

そのようなときに dependson オプションで,依存したいチャンクのラベルを指定します.

` ``{r chank-a, cache=TRUE}

data <- read.csv("foo.csv.gz")
` ``

` ``{r chank-b, dependson=c("chank-a"), cache=TRUE}
plot(data)
` ``

また dependson オプションは numeric の配列を指定することができます.

たとえば,dependson=1 を指定したときは,同一の R markdown ファイルの最初のチャンクに対して依存することを意味します.

また dependson=c(-1, -2) のような指定をしたときは,1つ前のチャンクと2つ前のチャンクに依存することを意味します.

数値での指定の仕方はメンテナンス性が高いとはいえないので,ラベルでの指定をおすすめします.


autodep オプション

autodep=TRUE にすると,依存していると思われるグルーバル変数を自動的に判定して,オプションをしてしたチャンクを再評価するかどうかを決めます.

autodep=TRUE をしていしたときは,dependson オプションを別に明示的に指定する必要はありません.


キャッシュ制御の各チャンクオプションの挙動


キャッシュのどこで使うか(あるいはどこで使えないか)


向いている使い方


CSV などの RData 以外のデータロード

RData 以外の CSV などのデータを R で読み込むときは,大きなデータのときは時間がかかることがあります.

そのようなときに,cache=TRUE としてキャッシュ化しておくことで,内部的には RData としてキャッシュ化されます.

そのため反復的に knit2html などを実行するときに,処理時間のコストが高くなります.

` ``{r load-data, cache=TRUE}

data <- read.csv("foo.csv.gz")
` ``


向かない使い方


単純に for 文で変数を更新するような処理

1つのチャンクの中で,反復的に同一変数が変更されるような処理には,キャッシュは機能しないので向きません.

for 文などでの

` ``{r cache=TRUE}

data <- 1
for (i in 1:100) {
data <- data + 1
}
` ``


練習問題集


練習問題:キャッシュの効果を体験しよう

キャッシュを効かせたときに,どのような効果がでるか?


キャッシュを効かせていない状態でつぎのコードを2回実行してみよう

つぎのファイルを cache-false.Rmd として作成して保存します.


cache-false.Rmd

` ``{r cache=FALSE}

x <- iris[, 1:4]
result <- kmeans(x, iter.max=1000)
` ``


キャッシュを効かせた状態でつぎのコードを2回

つぎのファイルを cache-true.Rmd として作成して保存します.


cache-true.Rmd

` ``{r cache=TRUE}

x <- iris[, 1:4]
result <- kmeans(x, iter.max=1000)
` ``


参考