Amazon linuxサーバーにインストールされたRと通信するためにJRI(rJava)を使用するTomcat6で実行されているJavaサーブレットがあります。ソースからRをインストールし、cranを介してrJavaをインストールし、R_HOMEとTomcatのクラスパスを設定しました。java.library.pathにディレクトリを含めるように構成できなかったため、必要なネイティブライブラリ(libjri.so、libR.so、およびlibRblas.so)へのjava.library.pathディレクトリの1つにいくつかのシンボリックリンクを設定する必要がありました。彼らがインストールしたことですが、それは問題ではないと思います。私が走るとき
./run rtest
$ R_HOME / library / rJava / jri /のコマンドラインから期待どおりの出力が得られ、REngineクラスはeval()を介してRステートメントを正常に作成しているようです。しかし、クラスからeval()を呼び出すと、ほとんどの場合、REXPオブジェクトの代わりにnullが返されます。DEBUGがオンの有無にかかわらずログに記録されるエラーはありません。REXPが返されるのは、配列を設定したときだけです。
array1=c(7245.0, 6003.0, 5504.0)
この場合、toString()値がであるREXPを取得します
[REAL* (7245.0, 6003.0, 5504.0)]
しかし、次にeval()呼び出しを行うと
summary(array1)
予期されたREXPの代わりにnullが返されます。私のMacで動作するコードは次のとおりです。
private REXP multipleRegression(Datalist list) {
String fitStr = "fit <- lm(";
for (int i = 0; i < list.size(); i++) {
Datastream ds = list.get(i);
String dsStr = ds.getId() + "=" + ds.toArrayString();
System.out.println("VALUE: " + this.eval(dsStr));
System.out.println("SUMMARY: " + this.eval("summary(" + ds.getId() + ")"));
fitStr += ds.getId();
if (i == 0)
fitStr += " ~ ";
else if (i == list.size() - 1)
fitStr += ")";
else
fitStr += " + ";
}
if (list.size() == 1) {
fitStr += "1)";
}
this.eval(fitStr);
return this.eval("summary(fit)");
}
繰り返しになりますが、これは私のMacで機能するので、問題はコードではなく環境にあると確信しています。私は数時間の検索を行いましたが、まだ解決策を見つけていません。どんな助けでも素晴らしいでしょう。