2010-02-01 7 views
13

Qual è il modo migliore per chiamare la funzionalità R da Java?R da Java

Sto cercando un modo rapido, semplice e affidabile per creare diagrammi di dispersione 2D standard e istogrammi in R utilizzando le mie applicazioni Java. Mi stavo chiedendo quali pacchetti/interfacce emergessero in una rapida ricerca su Google sarebbe stato più comodo da usare.

Non vedo l'ora di ricevere i vostri suggerimenti!

+4

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

risposta

15

Utilizzare JRI: http://www.rforge.net/JRI/. Viene fornito in bundle con rJava, compresi alcuni esempi di utilizzo.

Un esempio molto semplice sarebbe come questo:

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

dove hai ottenuto il TextConsole() passato come parametro da Rengine? Non riesco a compilare questo programma a causa di esso. –

+0

Non penso che un esempio incompleto (senza le necessarie istruzioni 'import') debba essere selezionato come risposta accettata. @Shane: se puoi, riempi gli spazi vuoti dell'esempio che hai fornito. – Giupo

+0

JRI ha una sottodirectory 'examples' dove puoi vedere esempi più completi. In 'rtest.java' troverai il sopra con un sacco di cose extra e troverai anche la' classe mancante TextConsole implementa RMainLoopCallbacks {...} ' – RolandASc

3

ho trovato che si biforcano R come processo, allegando flussi stdin, stdout, e stderr del processo, e l'invio R comanda tramite il flusso di input per essere abbastanza efficace. Io uso il filesystem per comunicare tra R e il mio processo Java. In questo modo, posso avere più processi R in esecuzione da diversi thread in Java e i loro ambienti non sono in conflitto tra loro.

+2

Puoi avere più istanze di JRI in esecuzione in thread separati e non ci saranno conflitto. – Shane

4

C'è qualcosa di nuovo chiamato http://www.renjin.org/

Una cosa mi piace più di JRI è distribuzione, mentre jri necessario che gli utenti dell'applicazione potranno scaricare R, renjin non lo fa, e utilizza solo il JVM a correre.