R(Rserve) と Rails を連携する(Centos)


目的

railsによるアプリケーションにて、Rによる処理を利用する

環境

Centos6.6
Rails 4.2.3
R3.2.3
Rserv :Rによる処理を提供する

手順

R のインストール

Rのインストール
http://qiita.com/na_ga/items/6ffe45e6ab89e110f709

#yum -y install R
#rpm -qa | grep R-

R_HOMEに環境変数を設定する

export R_HOME=/Library/Frameworks/R.framework/Resources

Rの起動

$R

大文字R
コマンドでRを起動できる

Rserve

Rコマンドで起動したRから、Rservのインストールを行う

install.packages("Rserve")

インストール先は以下となる   
/usr/lib64/R/library/Rserve

注1

以下の表示となればダウンロードできる

ribrary()
コマンドを打つと Rservがいることが確認できる

注2

Rservの起動

$ R CMD Rserveコマンドでターミナルから起動する。
以下のメッセージが出ていれば成功

$ R CMD Rserve

R version 3.2.3 (2015-12-10) -- "Wooden Christmas-Tree"
Copyright (C) 2015 The R Foundation for Statistical Computing
Platform: x86_64-redhat-linux-gnu (64-bit)

R は、自由なソフトウェアであり、「完全に無保証」です。 
一定の条件に従えば、自由にこれを再配布することができます。 
配布条件の詳細に関しては、'license()' あるいは 'licence()' と入力してください。 

R は多くの貢献者による共同プロジェクトです。 
詳しくは 'contributors()' と入力してください。 
また、R や R のパッケージを出版物で引用する際の形式については 
'citation()' と入力してください。 

'demo()' と入力すればデモをみることができます。 
'help()' とすればオンラインヘルプが出ます。 
'help.start()' で HTML ブラウザによるヘルプがみられます。 
'q()' と入力すれば R を終了します。 

Rserv started in daemon mode.
  • デーモンの停止 lsof -i:6311にてポート番号からプロセスIDを見つける
lsof -i:6311
COMMAND   PID            USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
Rserve  12173 higashinakano01    3u  IPv4 882750      0t0  TCP localhost:6311 (LISTEN)

以下のコマンドでプロセスを切る
kill -9 PID

kill -9 12173

Rserve-Ruby-client

Rservのクライアントをインストールする

コンソールからgemでクライアントをインストールする

gem install rserve-client

Rails アプリケーションの作成

参考 http://qiita.com/HirofumiYashima/items/7c98e22246f0e0dd22b0
アプリケーションを作成する
r_test という名前でサンプルアプリを作る

rails new r_test

アプリケーションが生成される

Gemfile Railsの設定

Gemfileに以下を追加する

gem 'rserve-client', require: 'rserve'

ちなみに、Rに限った話ではないが、上の
therubyracerのコメントアウトを外すのも忘れずに

追加後
bundle install
コマンドで適用する

サーバ自動起動設定

/usr/lib64/R/library/Rserve/libs/Rserve
パスは環境によって異なる

/config/environments/development.rbに

developement.rb
config.after_initialize do
  rserve_port = 6311
  rserve_path = "/usr/lib64/R/library/Rserve/libs/Rserve"
  system("R CMD #{rserve_path} --RS-port #{rserve_port} --slave")
end

コントローラ、ビューを生成する

rails g controller page test

routes.rb

ルーツファイルにコントローラを追加
config/routes.rb

routes.rb
get 'page/test'

コントローラ

app/controllers/page_controller.rb
以下、参照

# encoding:UTF-8
class PageController < ApplicationController

  def test
    c = Rserve::Connection.new
    c.assign("root", Rails.root.to_s)

    c.eval <<-EOF
      # 標準正規分布に従う乱数の発生
      x = rnorm(100,0,1)
      # ヒストグラムを作成して保存
      png(paste(root, "/app/assets/images/test.png", sep=""))
      hist(x)
      dev.off()
    EOF
  end

end

ビュー

参照
app/views/page/test.html.erb

test.html.erb
<h1>R on Rails with Rserve</h1>
<%= image_tag 'test.png' %>
~                              

サーバを起動

WEBRickサーバを起動します

$rails s -b 0.0.0.0

確認

http://ipアドレス:ポート番号/page/test
にてブラウザからアクセス

Ruby on rails からRservを利用してRの計算結果を出力することができました

他の方法

rsrubyのインストール

Rserve

sakuraVPScentosに入れる
http://blog.goo.ne.jp/xmldtp/e/343b05ef5090ae825a6d0bfe8c79f3b5

 トラブル

注1

22までにあるサーバから選択しても、エラーとなってしまう
実はここに出ているミラーはすべてではない。

Selection に22を選択し、他の候補を選択すると、
もっと近いサーバが見つかる
日本のサーバを選ぶ Japan YAMAGATを選択した

注2

このあと、Rservの起動時、

/mergefat Rserve.dbg "/usr/lib64/R/bin/Rserve.dbg"
installing via 'install.libs.R' to /usr/lib64/R/library/Rserve
** R
** inst
** preparing package for lazy loading
** help
*** installing help indices
  converting help for package ‘Rserve’
    finding HTML links ...  完了 
    Rserv                                   html  
    run.Rserve                              html  
    self                                    html  
** building package indices
** testing if installed package can be loaded
* DONE (Rserve)
Making 'packages.html' ...  完了 

 ダウンロードされたパッケージは、以下にあります 
    ‘/tmp/RtmpWMDbDr/downloaded_packages’ 
 '.Library' 中のパッケージの HTML 索引を更新します 
Making 'packages.html' ...  完了 

もし、このメッセージが以下のように

$ R CMD Rserve
/usr/lib64/R/bin/Rcmd: line 62: exec: Rserve: not found

Rservコマンドが起動せず、ディレクトリが実際見つからなかった場合、Rservのインストールに実は失敗していた可能性が有る
Rでのインストール時のログで

cp: cannot create regular file `/usr/lib64/R/bin/Rserve': 許可がありません
make: [server] エラー 1 (無視されました)
./mergefat Rserve.dbg "/usr/lib64/R/bin/Rserve.dbg"
cp: cannot create regular file `/usr/lib64/R/bin/Rserve.dbg': 許可がありません
make: [server] エラー 1 (無視されました)

というようなのがある場合、失敗している。
この場合ディレクトリが作られていないよう

ちゃんと作成されいない場合、Rを起動した権限が足りていないため正しくインストールされていなかった可能性が有る。
sudoでRを起動した上でインストールを行う等で解決できる