Я использую JRI в качестве ведомого для расчета статистики из Java. Вычисления R требуются время от времени, но не слишком часто. Таким образом, я решил создать метод-оболочку для вычислений, который создает новый экземпляр REngine, а также закрывает его в конце. Все работает как шарм при первом вызове метода. К сожалению, повторный вызов вызывает ошибку «R уже инициализирован».
Инициализация:
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;
}
Метод обертки:
public static void performR(){
//Create instance of R engine
Rengine re = createEngineInstance();
//Perform some R operations
re.eval("...");
re.end();
}
Очевидно, что экземпляр REngine не завершается корректно. Таким образом, мне нужно знать: 1) Есть ли возможность завершить работу REngine и позже снова создать новый экземпляр? Как это работает правильно? Я знаю, что с JRI невозможно запустить несколько потоков R одновременно, но это не то, к чему я стремлюсь. 2) Если это не так, я бы создал один экземпляр, используя шаблон Singleton. Как в этом случае я могу гарантировать, что сеанс R будет закрыт при завершении программы?
Ваша помощь очень ценится! Спасибо!