RubyからRを叩きたい
はじめに
F#に魂を売り渡したとしていても、そういうRuby欲、あると思います。ざっと調べたところ、RinRubyなるライブラリを使うのがよさそうだった。ただ2年前の情報なので、これが一番いいのかは自信あまりない。参考リンクにあるように、愛ちゃんパイセン(@dritoshi)が4年も前に試してるところをみると、今は他の何かがあるかも?
RinRubyのサイト
公式サイト
このGithubを見たところ、別のRubyからRを使うライブラリとして、RSRubyなるものもある
こちらは日本語の記事がRinRubyよりひっかかるので、そっちでもいいかも?・・・なんて思ってたら、こっちは@berobero11氏がすでにきれいにまとめてくださっていた、ありがたい。
使い方
まず、Ruby側でのパッケージのインストール
gem install rinruby
でインストール。適当に走らせたサンプルは以下。実行すると、正規乱数の結果を表示したり、ランダムフォレストの結果(元はテーブル、ただしRuby上ではRubyの行列)が出る。
# -*- coding: utf-8 -*- require "rinruby" # R.xxxxでR上の変数にアクセス可能。ない場合は変数の作成 # R上で10個正規乱数を生成して、R上のxという変数に格納 R.x = R.pull "rnorm(3)" # あるいはevalを用いて以下のようにもかける R.eval "y <- rnorm(3)" # 作った乱数配列の和・標準偏差を計算 x_sum = R.pull "sum(x)" x_sd = R.pull "sd(x)" # Ruby で出力する puts x_sum puts x_sd puts (R.pull "y") puts (R.y) #1つ上と等価な表現 # 以下のdata.frameの受け渡しはだめだった #z = R.pull "iris" #puts z # ヒアドキュメントを使ってそれっぽい分析も(以下の例はランダムフォレスト) # ライブラリの読み込みも可能 R.eval <<EOS library(randomForest) train <- sample(nrow(iris), 0.8*nrow(iris)) test <- setdiff(1:nrow(iris), train) iris.rf <- randomForest(Species~., data=iris[train,]) iris.pred <- predict(iris.rf, iris[test,]) res = table(iris[test, 5], iris.pred) EOS puts R.res # Rを終了 R.quit
data.frame渡したい
RinRubyでdata.frameをRubyとやりとりしようとすると難しいくさい。
なので、上のStackoverflowの回答では、またまた、別のライブラリとして
使うのがいんじゃね?って話が出ていた。このGithubにはここで挙げた3つのRubyからRを使うライブラリのプロコンが載っているので、それを見て、自分のやりたいことと照らし合わせるのがよさげっぽ。あるいは上記の@berobero11氏のBLOGにあるようにRSRubyかなあ。