R Markdown で使用するチャンクには、
{r チャンク名}
でチャンク名をつける事ができます。
ほとんどの場合、チャンク名をつけなくても問題はないのですが、
cache オプションをつけるときには、チャンク名が重要な意味を持ってきます。
cache オプションとは
cache オプションは「処理結果を保存する」という意味です。
チャンクのコードは、Knitする度に計算されます。
もし、演算にかなりの時間を費やすコードが含まれている場合、Knitの時間も長くなるので、
そんなときに
cache = TRUE
オプションをつけておくと計算時間を短縮できます。
最初のKnit時に結果をファイルとして保存し、次回からはその結果を読み込むだけ、という形にするからです。
チャンク内のコードが修正された場合、Knit時にもう一度処理を行います。
ここで、チャンク名を入れていなかったら……
チャンク名がない場合の例: ```{r} X <- c(1, 4, 5, 8, 10, 13) ``` ```{r, cache=TRUE} sum(X) ```
この構造自体に問題はありません。
コンソールには
[1] 41
と出てきます。
ところが、ここで
X
の値を
i <- c(1, 4, 6, 8, 10, 13)
に変更してもう一度 Knit を行った場合、コンソールの答えは
[1] 41
のままです。
それは、2番めのチャンクの結果はすでに保存されており、コードも修正していないから。
chace を無効化したい時
dependson オプション
あるチャンクの内容が他のチャンクの内容に依存している場合、
dependson
オプションを使う事で、特定のキャッシュを無効化し、更新された内容を参照するようになります。
方法は、参照元のチャンクにチャンク名をつけ、それに依存するチャンクに
dependson = "チャンク名"
とつければOK
チャンク名をつけ、dependsonを適用 ```{r name_X} X <- c(1, 4, 5, 8, 10, 13) ``` ```{r, cache=TRUE, dependson = "name_X"} sum(X) ```
X
の中身を変更すると、それに依存するチャンクで
cache = TRUE
でも再計算を行います。
cache.extra を追加
もう一つの方法としては、別のチャンクオプション
cache.extra = ○○
を使う方法です。
例えば、データファイルが変更されたときに新しい内容のデータを参照して欲しい場合、
cache.extra = file.mtime('ファイル名.csv')
、もしくは
eache.extra = tools::md5sum('ファイル名.csv')
を追加します。
指示内容は下記。
- file.mtime : フィイルの更新時刻が変更されたらキャッシュを無効化する
- tools::md5sum : ファイルの中身が変更されたらキャッシュを更新する
他にも、
- Rのバージョン:
cache.extra - getRversion()
- システム日付:
cache.extra - Sys.Date()
- オペレーティングシステム:
cache.extra = Sys.info()[['sysname']]
など、色々応用できます。
References
This book showcases short, practical examples of lesser-known tips and tricks to helps users get the most out of these tools. After reading this book, you will understand how R Markdown documents are transformed from plain text and how you may customize nearly every step of this processing. For example, you will learn how to dynamically create content from R code, reference code in other documents or chunks, control the formatting with customer templates, fine-tune how your code is processed, and incorporate multiple languages into your analysis.