1

Java で R コードを実行するために、JRI を使用して Java コードを開発しました。今、私は R の sqldf パッケージを使用しなければならず、Java コードでその関数を使用しようとしている問題 (データ フレームの列で個別の値を取得する) に遭遇しました。サンプル コードは次のとおりです (オレンジ色は、既定で R に既に存在するデータセットです)。

public class RCode2 {
    public static JRIEngine re;
    private static  org.rosuda.REngine.REXP rexp;

    public RCode2()
    {
        try {
            re = new JRIEngine(new String [] {"--vanilla"});
        } catch (REngineException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        }
        System.out.println("Rengine created, waiting for R");               
    }
    public static void main(String[] args) {
        RCode2 rCode2= new RCode2();
        rCode2.testSqldf(); 
        re.close();
    }
    public void testSqldf(){
        rexp=re.parseAndEval("library(sqldf,lib.loc=\"C:/Program Files/R/R-"+"2.15.0/library\")\n");
        System.out.println(rexp.isNull());
        rexp=re.parseAndEval("dframe<-sqldf(\"select * from Orange\")");
        System.out.println(rexp.isNull());
    }
}

上記のコードの出力は次のとおりです。

Rengine created, waiting for R
true
true

これは、「dframe」に何も含まれていないことを意味します。しかし、R で同じ sqldf func: sqldf("select * from Orange") を実行しようとすると、35 行になります。Java で sqldf 関数を使用して目的の結果を得るにはどうすればよいですか?

私の環境変数は次のように設定されています:

R_HOME=C:\Program Files\R\R-2.15.0
R_LIBS=C:\Program Files\R\R-2.15.0\library
R_LIBS_USER=C:\Program Files\R\R-2.15.0\library
Path=C:\Program Files\R\R-2.15.0\bin\i386;C:\Program Files\R\R-2.15.0\library\rJava\jri
4

1 に答える 1

1

あなたが投稿したコードはコンパイルさえしません。クリーンアップした後、問題なく動作します。

C:\Program Files\R\R-2.15\library\rJava\jri>run RCode2
Rengine created, waiting for R
org.rosuda.REngine.REXPString@10d448[14]
org.rosuda.REngine.REXPGenericVector@1bf216a+[3]named

コードに問題がある場合は、コードによって発生したエラーを実際に確認できるように、R コンソールから I/O を提供していることを確認する必要があります (例の TextCondole クラスを参照)。

最後に、stats-rosuda-devel メーリング リストは、rJava/JRI について質問する場所です。

コード:

import org.rosuda.REngine.JRI.*;
import org.rosuda.REngine.*;

public class RCode2 {
    public static JRIEngine re;
    private static  org.rosuda.REngine.REXP rexp;

    public RCode2()
    {
        try {
            re = new JRIEngine(new String [] {"--vanilla"});
        } catch (REngineException e) {
            e.printStackTrace();
        }
        System.out.println("Rengine created, waiting for R");               
    }
    public static void main(String[] args) {
        RCode2 rCode2= new RCode2();
        rCode2.testSqldf(); 
        re.close();
    }
    public void testSqldf(){
        try {
            rexp = re.parseAndEval("library(sqldf)");
            System.out.println(rexp);
            rexp = re.parseAndEval("dframe<-sqldf(\"select * from Orange\")");
            System.out.println(rexp);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
于 2012-04-26T14:53:51.383 に答える