読者です 読者をやめる 読者になる 読者になる

TakayukiKoyama Geek Blog

Create, Entertain, Experience

CentOSにRSRubyを入れようとして手こずる話

Ruby R RSRuby CentOS

色々なサイトをググってるとやはりRSRubyを入れるのはハードルがあるらしい(パス指定的な意味で)。

 R on Rails with Rserve - WEB SALAD

 WebページのバックグラウンドにR言語を実装する4つの方法~ (1)Ruby on Railsから動かす3つの方法 or (2) Shiny serverにアップロードする方法 - Qiita

目的

 私の目的としてはサーバ上でR処理ができるようにしてRuby on Railsでアプリケーションを作ってみたいというかんじ。そこでCentOSでRSRubyを導入する方法を探したけど、Ubuntuばかり。

 Baby steps with RSRuby in Rails | What You're Doing Is Rather Desperate

 RSRubyを導入 - たぐってつづる

 とは言っても、全く違うというわけでもないので、参考にしながらうまくいかないところを自分で考えてみる。

そもそもR入れてなかった。

 大学院時代にRいじってたから入れてるつもりだったけど、サーバには入ってなかったw

 ということでRとR関連もろもろをyumでインストール。

$ sudo yum install R R-core R-core-devel R-devel -y

 うまくいかない場合はEPELが必要かもしれないので、EPEL導入に関する参考サイトを見ながら入れてください。

 CentOSにEPELリポジトリを追加する - Qiita

gem install rsrubyでRSRubyを入れる

 下調べしてるので当然ながら、gem install rsrubyだけではインストール出来ない(Rubyが入っているのは前提)。

 サイトを見る限りではRのhomeとincludeのパスを張らないといけないらしい。で、includeのありかを探すのが大変だった。大抵のサイトは/usr/lib/R/includeもしくは/usr/incude/Rらしいけど、CentOSの場合、中身は空だった。

 うまくパスが張れないと、Rのライブラリが見つからなくて「ERROR: Cannot find the R library, aborting.」のエラーが出る。

 サイトを見なおしてみたら、下記のサイトに「libR.soのシンボリックリンク」を張ったほうが良いと書いてあったので張ってみた。

 RSRubyを導入 - たぐってつづる

$ sudo ln -s /usr/lib64/R/lib/libR.so /usr/lib/libR.so

 で、インストール

$ gem install rsruby -- --with-R-dir=/usr/lib64/R --with-R-include=/usr/lib64/R/include/ --with-R-home=/usr/lib/R

 (--with-R-dirもしくは--with-R-homeのどっちかは不要だと思う。パスの試行錯誤で付けてしまったがインストールできたのでそのままにしてる)

 とりあえず、これでRSRubyはインストールできました。

RSRubyの動作を確認してみる

 下記のサイトのFisher検定プログラムをお借りしてRを実行してみる。

 RSRubyの導入 - takayu-k.archives

$ vim test.rb

require 'rsruby' r = RSRuby.instance r.matrix.autoconvert(RSRuby::NO_CONVERSION) m = r.matrix([1,2,3,4],:nrow=>2,:ncol=>2) puts r.is_matrix(m) puts r.fisher_test(m) # putsは勝手に付け加えた

$ ruby test.rb
true
{"p.value"=>1.0, "conf.int"=>[0.008512237763288662, 20.296715039567143], "estimate"=>{"odds ratio"=>0.6937929829764401}, "null.value"=>{"odds ratio"=>1.0}, "alternative"=>"two.sided", "method"=>"Fisher's Exact Test for Count Data", "data.name"=>"structure(1:4, .Dim = c(2L, 2L))"}

 めでたしめでたし?

 ......いやいや、まだ導入しただけで始まってすらいないよ。

広告を非表示にする