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


![スクリーンショット 2016-02-20 13.48.39.png](https://qiita-image-store.s3.amazonaws.com/0/57455/d685cf87-b802-5d4f-3869-6d7c15186b8e.png)

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

![スクリーンショット 2016-02-20 13.49.25.png](https://qiita-image-store.s3.amazonaws.com/0/57455/f64c3128-d1c2-532a-a7ab-923ba23e66bf.png)

> ribrary()
コマンドを打つと　Rservがいることが確認できる
![スクリーンショット 2016-02-20 13.54.04.png](https://qiita-image-store.s3.amazonaws.com/0/57455/5a944d4a-8a2f-e4a3-2b5b-09b9f55e050f.png)

注２


## 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](https://qiita-image-store.s3.amazonaws.com/0/57455/587c96e0-f496-fa17-bf5a-fa60db625650.png)

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

## サーバ自動起動設定
/usr/lib64/R/library/Rserve/libs/Rserve
パスは環境によって異なる

/config/environments/development.rbに

```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 

```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 

```html: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](https://qiita-image-store.s3.amazonaws.com/0/57455/a2ffab6f-eed5-d787-c757-d7cfc8eb3d9f.png)

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

# 他の方法
## rsrubyのインストール
http://learningr.hatenablog.com/entry/2012/01/07/172802

## Rserve
http://web-salad.hateblo.jp/entry/2013/02/07/000000

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

#　トラブル
## 注１
![スクリーンショット 2016-02-20 13.48.39.png](https://qiita-image-store.s3.amazonaws.com/0/57455/d685cf87-b802-5d4f-3869-6d7c15186b8e.png)

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

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

## 注２
このあと、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を起動した上でインストールを行う等で解決できる