RMarkdown

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

にほんブログ村 子育てブログ ワーキングマザー育児へ