Ich benutze JRI als Berechnungs-Slave für Statistiken innerhalb von Java. R-Berechnungen sind von Zeit zu Zeit erforderlich, aber nicht zu häufig. Daher entschied ich mich, eine Wrapper-Methode für die Berechnung zu erstellen, die eine neue REngine-Instanz erstellt und diese bis zum Ende schließt. Alles funktioniert wie ein Zauber, wenn man die Methode das erste Mal aufruft. Leider wird beim zweiten Aufruf der Fehler "R ist bereits initialisiert" ausgelöst.Java-R-Brücke "JRI" -Fehler: R ist bereits initialisiert
Initialisierung:
private static Rengine createEngineInstance(){
//Initialise R Engine.
Rengine re=new Rengine (new String [] {"--vanilla"}, false, new CallbackListener());
//Wait until REngine-thread is ready
if (!re.waitForR())
{
System.err.println ("Cannot load R. Is the environment variable R_HOME set correctly?");
System.exit(1);
}
return re;
}
Wrappermethode:
public static void performR(){
//Create instance of R engine
Rengine re = createEngineInstance();
//Perform some R operations
re.eval("...");
re.end();
}
Offensichtlich ist die REngine Instanz nicht korrekt beendet. Also muss ich wissen: 1) Gibt es eine Chance, die REngine zu beenden und später eine neue Instanz zu erstellen? Wie funktioniert das richtig? Ich weiß, dass es unmöglich ist, mehrere R-Threads gleichzeitig mit JRI auszuführen, aber das ist nicht mein Ziel. 2) Wenn dies nicht der Fall ist, würde ich eine Instanz mit dem Singleton-Muster erstellen. Wie kann ich in diesem Fall sicherstellen, dass die R-Sitzung beim Beenden des Programms geschlossen wird?
Ihre Hilfe wird sehr geschätzt! Vielen Dank!
Obwohl dies nicht die Antwort ist, die Sie erwartet haben, versuchen Sie es mit Renjin http://www.renjin.org/, es verwendet nicht den R-Interpreter, also haben Sie nicht diese Art von Problem (es gibt andere Probleme damit obwohl ...) –