R Markdownで楽々レポートづくり

第4回 レポつく自由自在 ~R Markdownにまつわるエトセトラ~

この記事を読むのに必要な時間:およそ 4.5 分

キャッシュにまつわるエトセトラ

前回の記事で紹介したように,時間がかかる処理を行うコードチャンクではキャッシュを有効にすると効率よくレポートづくりを進められます。チャンクオプションcache=TRUEを指定したコードチャンクでは,コードに変更がなければコードは再評価されずに以前のキャッシュの出力が再利用されます。コードに変更があればコードが再評価されて,新しい出力が利用されます。

通常はこれで充分ですが,実際の解析ジョブではコードの変更だけでなく,作業環境の変更や入力データの変更などに応じてコードの再評価が必要な場面が出てきます。ここでは,キャッシュされたチャンクを再評価するための方法をいくつか紹介します。

キャッシュのリフレッシュ

最も確実に全てのコードを再評価する方法は,キャッシュオブジェクトが保存されているディレクトリの削除です。キャッシュ保存パスはチャンクオプションcache.pathで指定できます。R Markdownではデフォルトは.Rmdファイル名_cacheとなっています。このディレクトリを削除すればキャッシュされたものがなくなってしまうので,全てのコードが再評価されます。

cache.extraの利用

チャンクオプションが変更された場合もキャッシュは無効化されます。この仕組みを利用して,セットアップチャンクなどでチャンクオプションcache.extraを一括指定することで,全チャンクを強制的に再評価することができます。例えば次のようにcache.extraにRのバージョン文字列を指定しておけば,Rのバージョンが変更になった時にキャッシュが無効になり再評価されます。

```{r setup, include=FALSE}
# セットアップチャンク
library(knitr)
opts_chunk$set(cache.extra = R.version.string)
```

Rのバージョン文字列の代わりに,日付Sys.Date()や,あるファイルのmd5ハッシュ値tools::md5sum('foo.ext')などにしておけば,日付が変わったりファイルに変更があった時にコードが再評価されるようになります。

入力ファイルへの依存

大きなファイルの処理はコストがかかるので,できるだけキャッシュを活用したいことでしょう。ですが,外部からログを取得する場合など,ファイルに変更があった時だけコードを再評価してほしいという事情もあります。もちろん,そのようなときに手作業でキャッシュフォルダを削除したり,cache.extraを変更することも可能ですが,そもそもこの連載の目的は手作業の排除です。自動的にログを取得しているのに,それに応じて手作業でキャッシュ無効化の操作するとか,ありえませんよね?

このような場合,チャンクヘッダで適当なチャンクオプションにファイルのハッシュ値などを指定することで,ファイルに変更があった場合だけコードを再評価させることができます。

```{r cache=TRUE, cache.e = tools::md5sum("foo.csv")}
# foo.csvに依存する処理
# x = read.csv("foo.csv")
# ...
```

これで,foo.csvのmd5sumハッシュ値に変更があった時(≒ファイルに変更があった時)のみ,コードが再評価されます。どやっ!!

チャンクの依存関係

コードチャンクAで作成したオブジェクトをコードチャンクBで使って処理する場合,コードチャンクB自体に変更がなくてもコードチャンクAに変更があれば,コードチャンクBも再評価する必要があります。チャンク間の依存関係を明示することで,この動作を実現できます。チャンクオプションdependsonに依存するチャンクのチャンクラベル(以下の例ではc1を渡すことで,c1チャンクに変更があった時にc2チャンクも再評価されます。

```{r c1, cache=TRUE}
a = 1
print(a)
```

```{r c2, cache=TRUE, dependson = "c1"}
# c1に変更があればこのチャンクも評価される
b = a + 2
print(b)
```

また,チャンクオプションautodepTRUEにすると,自動的に依存するチャンクを検出してくれます。ただし,100%信頼できるわけではないので,可能な限りdependsonで明示するのが良いでしょう。

まとめ

今回の内容はやや高度だったかもしれません。このエトセトラを身に付ければR Markdown名人と言っても過言ではありません。きっと同僚から「いよっ,名人!」と賞賛されることでしょう。

また,今回も入稿したオリジナルの原稿である,自動変換処理などを行う前のR Markdownファイルやサンプルなどをまとめて公開しておきます。

突然ですが,著者は学生時代10年ほど京都に住んでいました。毎年この季節になると鴨川の納涼床も活気付き,祇園祭へ向けて京都の街中がソワソワとしてくるのを感じたものです。京都を離れてはや10年近く……最近では郷愁にも近いものを感じます。

今回紹介したレポートづくりのエトセトラを活用して仕事をさっさと終わらせて,そうだ京都,行こう!

次回は

レポートといえば主役はグラフや表です。次回はR Markdownでグラフや表を効果的に扱う方法を紹介します。

著者プロフィール

高橋康介(たかはしこうすけ)

東京大学先端科学技術研究センター特任助教。専門は認知科学,認知心理学,認知神経科学。どうやったら人が幸せな気持ちになれるのか研究中。著書に「R言語上級ハンドブック」(分担執筆・C&R研究所),「ドキュメント・プレゼンテーション生成」(共立出版)。趣味はラテ・アート。