RubyからRを叩きたい

はじめに

F#に魂を売り渡したとしていても、そういうRuby欲、あると思います。ざっと調べたところ、RinRubyなるライブラリを使うのがよさそうだった。ただ2年前の情報なので、これが一番いいのかは自信あまりない。参考リンクにあるように、愛ちゃんパイセン(@dritoshi)が4年も前に試してるところをみると、今は他の何かがあるかも?

RinRubyのサイト

公式サイト

Github

この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かなあ。

未来の俺へのメモ

インストールはRのバージョン指定したりでめんどいけど、大人しく@berobero11氏の

にならって、RSRubyが速度・使える型の多さからよさげ。