Java から R の機能を呼び出し (Rserve を使用)
Rserve とは, TCP/IP 接続できるサーバで,R の機能を、他のプログラムから使うことができるというものです. 詳しくは,http://www.rforge.net/Rserve/ を見てください.
R の機能を呼び出した結果は,Java 側の int, double, arrays, String, Vector や,その他の特定の R オブジェクトを扱うためのクラス(RBool, RList といったもので,RServe に付属のもの)のオブジェクトに格納される.
- Java プログラムから R の機能を呼び出したい.
- Java のプログラムの中に R のプログラムを埋め込む.ファイルが分かれるようなことは無い.
- (補足)Windows で Rserve を使うとき,UNIX で使う場合と比べて,いくつかの機能が使えないが,支障はない.
cooperative mode でのみ動く.このモードでは,(1) 1度に1つの接続しかできない. (2) 一連の接続では,同じ名前空間(name space)が使用される.
Rserve のインストール
- R システムでの操作
Rserve を rforge の http://www.rforge.net/Rserve/ からインストールするために,下記の関数を実行する.
install.packages("Rserve", repos="http://cran.rstudio.com/")
- インストール終了の確認
* 「・・・を作成できません: 許可がありません」というエラーメッセージが出た場合には、 R システムを管理者の権限で起動し、このWebページの手順を最初からやり直す.
- Rserve のファイルがインストールされたディレクトリを探す
以下 /usr/local/lib/R/library/rJava 下にあるものとして説明を続ける
- R がインストールされたディレクトリを探す
以下 /usr/local/lib/R 下にあるものとして説明を続ける
- 確認のため、付属のサンプルプログラムを動かしてみる
◆ Ubuntu での操作手順例
cd /usr/local/lib/R/library/rJava/jri/examples ./run rtest
- 今度は「run」を使わずに、付属のサンプルプログラムを動かしてみる
◆ Ubuntu での操作手順例
cd /usr/local/lib/R/library/rJava/jri javac -cp .:examples:src/JRI.jar:JRI.jar examples/rtest.java LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/R/lib:/usr/local/lib/R/bin java -Djava.library.path=.: -cp .:examples:src/JRI.jar:JRI.jar rtest
使用法
- Rserver の起動
library(Rserve) Rserve(args="--no-save")
* もし,「library(Rserve)」の実行で, 「'Rserve' という名前のパッケージはありません」というようなエラーが出たときは 「install.packages("Rserve", repos="http://cran.rstudio.com/")」を実行してインストールする.
- (オプション) ヘルプの表示
? Rserve
- Java ファイル「HelloWorld.java」の作成
ここでの例は
- パッケージ名: hoge.hoge.com
- クラス名: HelloWorld
としている.必要があれば,パッケージ名,クラス名を変えてください.
◆ Java ファイル「HelloWorld.java」の作成例
package hoge.hoge.com; import java.io.*; import java.awt.Frame; import java.awt.FileDialog; import java.util.Enumeration; import org.rosuda.JRI.Rengine; import org.rosuda.JRI.REXP; import org.rosuda.JRI.RList; import org.rosuda.JRI.RVector; import org.rosuda.JRI.RMainLoopCallbacks; public class HelloWorld { public static void main(String[] args) { // just making sure we have the right version of everything if (!Rengine.versionCheck()) { System.err.println("** Version mismatch - Java files don't match library version."); System.exit(1); } Rengine re=new Rengine(args, false, null); if (!re.waitForR()) { System.out.println("Cannot load R"); return; } try { REXP x1, x2, x3, x4; System.out.println(x1 = re.eval("rnorm(10)")); double d1[] = x1.asDoubleArray(); for ( int i = 0; i < 10; i++ ) System.out.println(d1[i]); System.out.println(x2 = re.eval("iris[[1]]")); double d2[] = x2.asDoubleArray(); for ( int i = 0; i < 50; i++ ) System.out.print(d2[i]+", "); System.out.println(x3 = re.eval("print(1:10/3)")); double d3[] = x3.asDoubleArray(); for ( int i = 0; i < 10; i++ ) System.out.println(d3[i]); System.out.println(x4 = re.eval("q()")); } catch (Exception e) { System.out.println("EX:"+e); e.printStackTrace(); } } }
◆ Ubuntu での操作手順例
cd /usr/local/lib/R/library/rJava/jri javac -cp .:examples:src/JRI.jar:JRI.jar examples/HelloWorld.java LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/R/lib:/usr/local/lib/R/bin java -Djava.library.path=.: -cp .:examples:src/JRI.jar:JRI.jar rtest