LoginSignup
6
6

More than 5 years have passed since last update.

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

Posted at

目的

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

スクリーンショット 2016-02-20 13.48.39.png

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

スクリーンショット 2016-02-20 13.49.25.png

ribrary()
コマンドを打つと Rservがいることが確認できる
スクリーンショット 2016-02-20 13.54.04.png

注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のコメントアウトを外すのも忘れずに
スクリーンショット 2016-02-20 19.03.26.png

追加後
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
にてブラウザからアクセス

スクリーンショット 2016-02-20 23.37.46.png

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

他の方法

rsrubyのインストール

Rserve

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

 トラブル

注1

スクリーンショット 2016-02-20 13.48.39.png

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を起動した上でインストールを行う等で解決できる

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6