スキップしてメイン コンテンツに移動

投稿

4月, 2012の投稿を表示しています

R5 reference class 編: R でいまどきなパッケージ開発 (devtools, testthat, roxygen2)

一週間ほど熱でうなされながら、とある研究に使うために、とあるプログラムのドキュメントをひたすら読んでいました。残念ながら R からアクセスするパッケージがないので自分で書いてみようかと思うのですが、どうせなら R5 reference class を使って実装してみようと、朦朧とする意識のなか考えていました。

その前に、R5のおさらいということで、以前のS4で実装した「R でいまどきなパッケージ開発 (devtools, testthat, roxygen2)」をR5にしてみました。解説を書くほど元気がないので、github にコードは置いてあげたので、興味のあるおにいちゃんは各自コード読んだらいいんだからねっ!

https://github.com/dritoshi/idol

無駄にツンデレいもうと風になったのはおそらく熱のせいですが、雑感を書いておくと、R5のほうが非常に簡潔に書けるので、今後は、R4で書く必要はないわー。このエントリーはS4のままになっていますが、github のコードは、R5になっています。S4, R5それぞれににタグを付けてあるので、どちらも github から入手できます。

https://github.com/dritoshi/idol/tags

devtools の check は通っても run_examples で reference class が見えないとかいうエラーに少しだけ泣かされました。reference class を正しく export してあげると右のアイコンのような笑顔に戻りました。テヘ。

Bioconductor でも R5 なパッケージが少しだけあるので、眺めてみたのですが、R5で実装しつつ、結局ユーザがさわる部分は、reference class のコンストラクタを普通の関数で実装し、ユーザにはこの関数しか見せない、みたいな過保護な実装が推奨されていて、S4を抜き身で submit して怒られた僕としては、いかにも連中らしいな、とほっこりしました(尊敬してます!)。しかし中身は setMethod も併用使いまくりで、なんというか、フランケンなんとかさんの作りたもうたアレやら、白鳥のバタ足やらを彷彿させる感じです。

もう熱もだいぶいいかんじです。では。

参考にしたサイトは以下の README.md にあります…

bioconductor.jp が R 本体の chooseBioCmirror() に取り込まれたよ

Bioconductor が近くなりました。

日本ミラーの bioconductor.jp を選択するには、以下のように、chooseBioCmirror() で 6 番を選ぶだけです。 options("BioC_mirror") で切り替わっていることを確認できます。試しに、BrainStars package をインストールしてみると、ちゃんと bioconductor.jp からインストールされているのがわかります。


ちなみに、開発版の BioC 2.11 を現在ミラー中です。

関連: bioconductor.jp を作ったよ

Rのコードを multicore を使って、テスト駆動開発でマルチコア化するよ

multicore パッケージを利用してマルチコア化してみます。とは言っても、sapply, lapply を mclapply にするだけの簡単なお仕事ですが、せっかくなので testthat を使ってマルチコア化する際にテスト駆動開発で実装していきます。

まずは、そのへんのアップルストアで購入可能な MacBook Air を購入しましょう。今回はこれでやります。Rも Mac 版の dmg を普通にインストールしましょう。次にパッケージをインストールします。

sudo R install.packages(multicore) install.packages(testthat) q()
インストールが簡単なのがよいですね。MPIとかそういうものをごちゃごちゃ設定する必要なないです。

今回は非有界区間のモンテカルロ積分によって、標準正規分布の累積分布関数を計算します。まずは for で書きます。

とりあえず、マルチコア化は置いておいて、みんな大好き apply 系関数に書きかえてみましょう。もちろん、まずテストを書きます。set.seed で乱数をシードを固定して、testthat で単体テストします。

R library("testthat") test_file("test_mci.r") もちろん失敗します。 sapply 版を実装します。 テストが通りました。 リストで返ってくるので、unlist するバージョンも作ります。またテストを書きます。 失敗を確認してから、実装を開始します。 テストが通ります。

前置きが長いですが、いよいよ、multicore 化です。でも先にテスト書きます。 テストが通らないことを確認し、実装します。 テストが通ることを確認してください。では速度比較をしてみます。 4 cores なのですが2倍程度は速くなりました。おもったより unlist のコストがかかってないですね。ちなみにコア数は、
> library(multicore) > multicore:::detectCores() でわかります。
ちなみに 16 CPU cores のマシンで実行したら 6 倍程度の高速化でした。