1

我已经使用 JRI 开发了 Java 代码,用于在 Java 上执行 R 代码。现在,我遇到了一个问题(在数据框的列中提取不同的值),我必须使用 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 回答