2012-04-26 4 views
1

Я разработал код Java, используя JRI для выполнения кода R на Java. Теперь я столкнулся с проблемой (выбирая различные значения в столбце фрейма данных), где я должен использовать пакет sqldf из R и пытаюсь использовать его функцию в своем Java-коде. Вот пример кода (Orange является набором данных уже присутствует в R по умолчанию):Вызов sqldf пакета R в Java с использованием JRI

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» не содержит ничего. Но когда я пытаюсь запустить тот же sqldf func: sqldf («select * from Orange») на R, то он дает мне 35 строк. Как использовать функции sqldf в java, чтобы получить желаемые результаты?

Мои переменные окружения устанавливаются следующим образом:

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 

Если у вас есть проблемы с вашим кодом, вы должны убедиться, что вы обеспечиваете I/O от R консоли, так что вы можете увидеть ошибки, вызванные вашим кодом (см класс 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