1

Rserve パッケージを使用して R と Java を接続するアプリケーションを作成しました。その中で、「評価は成功しましたが、オブジェクトが大きすぎて転送できません」というエラーが表示されます。Rconnection クラスでも送信バッファ サイズの値を増やしてみました。しかし、それはうまくいかないようです。転送されるオブジェクトのサイズは 4 MB です

ここにR接続ファイルのコードがあります

public void setSendBufferSize(long sbs) throws RserveException {

    if (!connected || rt == null) {
        throw new RserveException(this, "Not connected");
    }
    try {
        RPacket rp = rt.request(RTalk.CMD_setBufferSize, (int) sbs);
        System.out.println("rp is send buffer "+rp);
        if (rp != null && rp.isOk()) {
            System.out.println("in if " + rp);
            return;
        }
    } catch (Exception e) {
        e.printStackTrace();
        LogOut.log.error("Exception caught" + e);
    }

    //throw new RserveException(this,"setSendBufferSize failed",rp);        
}

完全な Java クラスは、 Rconnection.javaから入手できます。

4

1 に答える 1

0

RServe の代わりに、rJava パッケージに同梱されている JRI を使用できます。

私の意見では、JRI は RServe よりも優れています。別のプロセスを作成する代わりに、ネイティブ呼び出しを使用して Java と R を統合するからです。

JRI を使用すると、ポート、接続、ウォッチドッグなどについて心配する必要はありません。R への呼び出しは、オペレーティング システム ライブラリ (libjri) を使用して行われます。

メソッドは RServe とよく似ており、REXP オブジェクトを引き続き使用できます。

次に例を示します。

public void testMeanFunction() {

    // 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.");
        fail(String.format("Invalid versions. Rengine must have the same version of native library. Rengine version: %d. RNI library version: %d", Rengine.getVersion(), Rengine.rniGetVersion()));
    }

    // Enables debug traces
    Rengine.DEBUG = 1;

    System.out.println("Creating Rengine (with arguments)");
    // 1) we pass the arguments from the command line
    // 2) we won't use the main loop at first, we'll start it later
    // (that's the "false" as second argument)
    // 3) no callback class will be used
    engine = REngine.engineForClass("org.rosuda.REngine.JRI.JRIEngine", new String[] { "--no-save" }, null, false);
    System.out.println("Rengine created...");

    engine.parseAndEval("rVector=c(1,2,3,4,5)");
    REXP result = engine.parseAndEval("meanVal=mean(rVector)");
    // generic vectors are RVector to accomodate names
    assertThat(result.asDouble()).isEqualTo(3.0);
}

REST API を公開し、このパッケージを使用して R 関数を呼び出すデモ プロジェクトがあります。

見てみましょう: https://github.com/jfcorugedo/RJavaServer

于 2015-09-08T15:54:33.400 に答える