2010-02-01 13 views
13

¿Cuál es la mejor manera de llamar a la funcionalidad R desde dentro de Java?R desde dentro de Java

Estoy buscando una manera rápida, fácil y confiable de hacer diagramas de dispersión e histogramas 2D estándar en R usando mis aplicaciones Java. Me preguntaba qué paquetes/interfaces surgieron en una búsqueda rápida de Google serían más convenientes de usar.

Espero sus sugerencias!

+4

Duplicado: http://stackoverflow.com/questions/1136709/extend-my-java-application-with-r – Shane

Respuesta

15

Usar JRI: http://www.rforge.net/JRI/. Viene incluido con rJava, incluidos algunos ejemplos de uso.

Un ejemplo muy simple sería así:

import java.io.*; 
import java.awt.Frame; 
import java.util.Enumeration; 

import org.rosuda.JRI.Rengine; 
import org.rosuda.JRI.REXP; 
import org.rosuda.JRI.RVector; 
import org.rosuda.JRI.RMainLoopCallbacks; 

public class rJavaTest { 

    public static void main(String[] args) { 

     Rengine re=new Rengine(args, false, new TextConsole()); 
     REXP x; 
     re.eval("print(1:10/3)"); 
     System.out.println(x=re.eval("iris")); 
     RVector v = x.asVector(); 
     if (v.getNames()!=null) { 
      System.out.println("has names:"); 
      for (Enumeration e = v.getNames().elements() ; e.hasMoreElements() ;) { 
       System.out.println(e.nextElement()); 
      } 
     } 

     if (true) { 
      System.out.println("Now the console is yours ... have fun"); 
      re.startMainLoop(); 
     } else { 
      re.end(); 
      System.out.println("end"); 
     } 
    } 
} 
+6

¿de dónde sacaste la TextConsole() que pasaste como parámetro para Rengine? No puedo compilar este programa por eso. –

+0

No creo que un ejemplo incompleto (sin las declaraciones 'import' necesarias) deba seleccionarse como una respuesta aceptada. @Shane: si puedes, llena los huecos del ejemplo que proporcionaste. – Giupo

+0

JRI tiene un subdirectorio 'examples' donde puede ver ejemplos más completos. En 'rtest.java' encontrará lo anterior con un montón de cosas extra y también encontrará la clase' falta TextConsole implementa RMainLoopCallbacks {...} ' – RolandASc

3

he encontrado que se bifurcan R como un proceso, adjuntando a flujos stdin, stdout y stderr del proceso, y el envío de R comandos a través de la corriente de entrada para ser bastante efectivo. Utilizo el sistema de archivos para comunicarme entre R y mi proceso de Java. De esta forma, puedo tener múltiples procesos R ejecutándose desde diferentes subprocesos en Java y sus entornos no entran en conflicto entre sí.

+2

Puede tener varias instancias de JRI ejecutándose en hilos separados y no habrá conflicto. – Shane

4

No es algo nuevo llamado http://www.renjin.org/

Una cosa que me gusta más es JRI despliegue, mientras jri requiere que sus usuarios de la aplicación se descarga R, renjin no lo hace, y se utiliza sólo el JVM para funcionar.