packratで人類の拡大再生産に貢献する

こんにちは。R Advent Calendar 20日目です。
一人でも私は生きられるけど、でも誰かとならば人生ははるかに違いますね。
中島みゆきがそう歌っているので間違いないと思います。
そんな人との関わりが避けられない世の中で、reproducibleな環境を作ることは分析の手法を何にするか
ということと同じくらい大切な問題かもしれません。
今回はそんなreproducibleな環境を作るためのpackratパッケージのご紹介です。

packratパッケージでプロジェクト単位でのパッケージ管理を実現

packratパッケージは、Pythonでいうところのvirtualenvみたいなもんです。
まだ出来立てなのであそこまで高機能なわけではなくパッケージ管理だけですが。
packratでプロジェクト単位でパッケージ管理が可能になります。
つまり「お前のコード動かないんですけど」「???」「なんかggplot2でエラー吐いてるんですけど」「あっ仕様変更されてんじゃん死」みたいなケースを避けられるわけです。

packratパッケージの使い方

チュートリアルがあるのでこちらをどうぞ。
http://rstudio.github.io/packrat/walkthrough.html

packratパッケージをインストール

devtoolsパッケージのinstall_github()を使ってRStudioのレポジトリからインストールします。

devtools::install_github("packrat", "rstudio")

また下記に書いてある手順でプロジェクトのディレクトリを作っておきます。
http://rstudio.github.io/packrat/starting.html
これから先はここで作成したプロジェクトのディレクトリが作業ディレクトリである前提です。

セットアップする

bootstrap()を使ってセットアップします。
biocInstallerが無いとか怒られたら適宜インストールしてください。

#source("http://bioconductor.org/biocLite.R")
packrat::bootstrap()
現在のプロジェクトディレクトリにパッケージをインストールする
install.packages("reshape2")

パッケージはソースでCRAN等からダウンロードされ、ビルド&インストールされます。
本当はバイナリで落としてインストールしたいんだけどCRANがソースでしかアーカイブしてないし今後のアーカイブ事情に振り回されたくないのでソースで落としているという事情があるようです。
ビルドする環境が無い方は以下ご参照。
http://www.rstudio.com/ide/docs/packages/prerequisites
どんなパッケージをインストールしているかはstatus()でチェックします。

> packrat::status()
The following packages are installed but not needed:
             _      
    plyr       1.8  
    reshape2   1.2.2
    stringr    0.6.2
Use packrat::clean() to remove them. Or, if they are actually needed
by your project, add `library(packagename)` calls to a .R file
somewhere in your project.

インストールされているけど、必要ないパッケージがありますと出ます。
これはコードの中にパッケージの呼び出し(library(hoge))が無い場合に出ます。
reshape2を呼び出してみましょう。

>library(reshape2)
> packrat::status()

The following packages have been updated in your library, but have not
been recorded in packrat:
               library   packrat
    plyr           1.8        NA
    reshape2     1.2.2        NA
    stringr      0.6.2        NA
Use packrat::snapshot() to record these packages in packrat.

無事認識されました。
ここでsnapshot()を使ってスナップショットを撮ります。

> packrat::snapshot()

Adding these packages to packrat:
             _        
    lattice    0.20-24
    plyr       1.8    
    reshape2   1.2.2  
    stringr    0.6.2  

Fetching sources for lattice (0.20-24) ... OK (CRAN current)
Fetching sources for plyr (1.8) ... OK (CRAN current)
Fetching sources for stringr (0.6.2) ... OK (CRAN current)
Fetching sources for reshape2 (1.2.2) ... OK (CRAN current)
Snapshot written to /home/jmcphers/projects/babynames/packrat.lock 
Installing lattice... OK (built source)

スナップショットを撮ることで現在のパッケージインストール状況に戻れるようになります。
その際はrestore()を使います。

> remove.packages("plyr")
Removing package from
‘/home/jmcphers/projects/babynames/library/x86_64-pc-linux-gnu/3.0.2’
(as ‘lib’ is unspecified)
Changes made to this project's private library may need to be snapshotted.
Run packrat::status() to see differences since the last snapshot.

> packrat::status()

The following packages are missing from your library, or are out of date:
           packrat   library
    plyr       1.8        NA
Use packrat::restore() to install/remove the appropriate packages.

> packrat::restore()
Installing plyr (1.8) ... OK (built source)

また他のPCにプロジェクトをコピーした際は以下の様なメッセージが出ますのでinitPackrat()を使うと元のパッケージインストール状況を回復できます。

Creating private package library at
/home/jmcphers/projects/babynames/library/x86_64-pc-linux-gnu/3.0.2
Packrat needs to install the packages this project depends on. Run
initPackrat() to get started.
> initPackrat()
Initializing packrat... OK
Installing lattice (0.20-24) ... OK (built source)
Installing plyr (1.8) ... OK (built source)
Installing stringr (0.6.2) ... OK (built source)
Installing reshape2 (1.2.2) ... OK (built source)

とりあえずここまででご紹介は終わりです。
冒頭ののチュートリアルにGitとの連携なども書かれているのでご参照ください。

ちなみに冒頭の歌は以下のように続きます。
強気で強気で生きている人ほど些細な寂しさにつまずくものよ
先日この歌を教えてくれた方にこの間道でばったり出会いました。生まれたての娘さんを抱いていました。
皆さんは人類の拡大再生産に貢献していますか。私は来年C++に没頭する予定です。
それでは、皆さん良いお年を。