2012-04-26 58 views
1

我已经开发了使用JRI在Java上执行R代码的Java代码。现在,我遇到了一个问题(在数据框的列中选择不同的值),我必须使用R的sqldf包,并试图在我的Java代码中使用它的函数。下面是示例代码(橙色是数据集通过默认R中已经存在):使用JRI调用Java的R的sqldf包

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 

回答

1

您发布的代码甚至不编译:

我的环境变量设置如下。清洁起来后,它工作得很好:

C:\Program Files\R\R-2.15\library\rJava\jri>run RCode2 
Rengine created, waiting for R 
[email protected][14] 
[email protected]+[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(); 
     } 
    } 
} 
+0

是啊,这工作了。谢谢 :) – AksVidyarthi 2012-04-27 11:26:18