Hatena::ブログ(Diary)

研究開発創作日誌 このページをアンテナに追加 RSSフィード

2006-06-28

RSRuby-0.2 がリリース

Alex さんによって 2006-06-22 に rsruby-0.2 がリリースされました.

screenshot screenshot

このバージョンでは 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 側でデータフレームのクラスを準備するといいですね.

はてなユーザーのみコメントできます。はてなへログインもしくは新規登録をおこなってください。

トラックバック - http://d.hatena.ne.jp/nakao_mitsuteru/20060628/p1
Creative Commons License
このブログの個別に注のある作品以外はクリエイティブ・コモンズ・ライセンス 表示 2.1 日本としてライセンスされています。