【问题标题】:Calling sqldf package of R in Java using JRI使用 JRI 在 Java 中调用 R 的 sqldf 包
【发布时间】:2012-05-07 02:01:03
【问题描述】:

我使用 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

【问题讨论】:

    标签: java r jri sqldf


    【解决方案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();
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-01-17
      • 2015-11-29
      • 1970-01-01
      • 2015-03-11
      • 2017-06-18
      • 2013-08-16
      • 2012-03-19
      • 1970-01-01
      • 2012-12-01
      相关资源
      最近更新 更多