2008年6月30日月曜日

math/R をJava(Eclipse)から使う

追記(2015/2/18): 新しいの書いた.math/R 3.1.2 をJava 1.8.0_25 から使う (MacOSX 10.10.1 + Homebrew 0.9.5 + Eclipse 4.4.1)

追記(2009/10/6): rJavaに含まれたそうで,そのメモ



RをJavaから使うのに色々あるみたいなんですがまぁ流れ流れてJRIに行き着きました.
でやり方メモ.

環境
・MacOS X 10.5.3 / Java 1.5.0_13
・Eclipse 3.2.2
(・R 2.7.0)
(・JRI 0.4-1)

0.Rを入れる.
> sudo port install R

2.7.0が入った.

1.JRIをdownload, configure, make, テスト
JRIをdownloadして展開 (0.4-1)
・configureとmakeとテスト
> ./configure
> make
> ./run rtest
> ./run rtest2


2.必要なモノとコト
モノ
・src/JRI.jar
・src/libjri.jnilib
コト
・R_HOME=/opt/local/lib/R という環境設定
・LD_LIBRARY_PATH=${R_HOME}/bin:${R_HOME}/lib という環境設定
・既にLD_LIBRARY_PATHがあればLD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${R_HOME}/bin:${R_HOME}/lib
・Java実行時にjava.library.pathをlibjri.jnilibへ向けての設定.
・Javaコンパイル,実行時にclasspathにJRI.jarを含める設定.

3.試す.
3.1プロジェクトを作成
lib/JRI.jar, lib/libjri.jnilibを設置,lib/JRI.jarはプロジェクトに含めておく(説明を省きます).

3.2コード
Sample_Rクラスをつくってmainを書く.とりあえず動作させるだけなのでこんな感じ.
import org.rosuda.JRI.Rengine;

public class Sample_R {
 public static void main(String[] args) {
  if (!Rengine.versionCheck()) {
   System.err
     .println("** Version mismatch - Java files don't match library version.");
   System.exit(1);
  }
  Rengine re = new Rengine(new String[]{"--no-save"}, false, null);
  if (!re.waitForR()) {
   System.out.println("Cannot load R");
   return;
  }
  System.out.println(re.eval("sqrt(36)"));
  re.end();
 }
}


3.3実行環境の設定
・メニューバー Run/Open Run Dialog...を選択
・Sample_Rに関するものを選択,まずはArguments
VM argumentsとして'-Djava.library.path=./lib'を設定

・次にEnvironment
環境変数としてR_HOMELD_LIBRARY_PATHを設定する.LD_LIBRARY_PATHで同時に設定したR_HOMEが参照できなかった…のでとりあえず全部入力した.R_HOME=/opt/local/lib/R, LD_LIBRARY_PATH=/opt/local/lib/R/bin:/opt/local/lib/R/lib


4で実行.
[REAL* (6.0)]


とりあえず動いたけど.合ってるかしら?間違いがあればご指摘いただければ幸いです.

0 件のコメント: