RSRuby-0.2 がリリース
Alex さんによって 2006-06-22 に rsruby-0.2 がリリースされました.
- http://web.kuicr.kyoto-u.ac.jp/~alexg/
- http://web.kuicr.kyoto-u.ac.jp/~alexg/files/
- http://web.kuicr.kyoto-u.ac.jp/~alexg/files/rsruby.0.2.tar.gz
このバージョンでは R の List データ構造が Ruby の Hash に変換されるようになりました.List データ構造は t 検定などの統計的検定関数の返り値としても利用されているので,統計的検定の結果が ruby からもあつかえるようになりました.これは大きいです.
早速 rsruby/README をよみながら MacBook Pro でコンパイルしてみます.
$ sudo gcc_select 3.3 $ curl -O http://web.kuicr.kyoto-u.ac.jp/~alexg/files/rsruby.0.2.tar.gz $ tar ztvf rsruby-0.2.tar.gz $ tar zxvf rsruby-0.2.tar.gz $ cd rsruby $ cd lib $ ruby extconf.rb --with-R-dir=/Library/Frameworks/R.framework/Resources $ make $ make install $ rm Makefile $ cd ../../ $ export R_HOME=/Library/Frameworks/R.framework/Resources $ R CMD INSTALL rsruby
使ってみます.
$ irb irb(main):001:0> require 'rsruby/rsruby' => true irb(main):002:0> r = RSRuby.new => #<RSRuby:0x7dc20 @convert=true, @debug=false>
起動できました.
irb(main):006:0> r.seq(1,10) => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] irb(main):007:0> r.rnorm(2) => [1.35642466337031, 1.66950066506227]
このようにつかえます.
irb(main):024:0> x1 = r.norm(10, 1, 2) irb(main):025:0> x2 = r.norm(10, 0, 2) irb(main):026:0> t = r.call_R("t.test", x1, x2) irb(main):030:0> require 'pp' irb(main):031:0> pp t {"p.value"=>0.621188374779521, "null.value"=>0.0, "data.name"=> ["c(-0.453682304887409, 0.186564895630736, 3.92418092817845, -2.61916966287533, and c(1.19098075744499, 0.218642954491886, 1.18858837031767, -4.18573691161704, ", "1.42636899480069, -2.28633177975623, 2.98426671095424, 1.58776901165997, and -0.370781101741393, -0.748812374776698, 0.368519414498828, 3.03419755607259, ", "-4.68951798101007, -0.778878806170384) and 1.66029152012487, 2.22745105257418)"], "method"=>"Welch Two Sample t-test", "conf.int"=>[-2.75470466642242, 1.69435042024938], "alternative"=>"two.sided", "estimate"=>[-0.0718429993475333, 0.458334123738989], "parameter"=>16.7142303278872, "statistic"=>-0.50349323905265}
R の List は Ruby の Hash に変換されています.
t.test(stats) の返り値は R の htest クラスですが,実体は List です.
> r = t.test(seq(1:10), rnorm(10)) > class(r)[1] "htest" > is.list(r) [1] TRUE > attributes(r) $names [1] "statistic" "parameter" "p.value" "conf.int" "estimate" [6] "null.value" "alternative" "method" "data.name" $class [1] "htest"
さらに,データフレーム(data.frame)も実体は List なので対応できています.すばらしい.
irb(main):031:0> r.eval_R('Iris[1,]') => {"Sepal.L."=>5.1, "Sp"=>2, "Petal.W."=>0.2, "Petal.L."=>1.4, "Sepal.W."=>3.5} irb(main):032:0> r.eval_R('Iris$Sepal.L.') => [5.1, 4.9, 4.7, 4.6, 5.0, 5.4, 4.6, 5.0, 4.4, 4.9, 5.4, 4.8, 4.8, 4.3, ...
つぎは Ruby 側でデータフレームのクラスを準備するといいですね.