2

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で機能するので、問題はコードではなく環境にあると確信しています。私は数時間の検索を行いましたが、まだ解決策を見つけていません。どんな助けでも素晴らしいでしょう。

4

1 に答える 1

0

さて、それはネイティブ ライブラリとそのシンボリック リンクに関係していました。libjri.so、libR.so、および libRblas.so のシンボリック リンクを java.library.path に取得しなかったときに、アプリケーションで例外が発生しましたが、それらを取得すると、例外はなくなりました。libRlapack.so も必要であることがわかりました。それをシンボリックリンクすると、予想される REXP 値が返され始めました。

于 2012-08-19T05:59:25.097 に答える