“Java-R桥”;JRI“;错误:R已初始化
我使用JRI作为Java中统计数据的计算从属。R不时需要计算,但不太频繁。因此,我决定为计算创建一个包装器方法,该方法创建一个新的REngine实例,并在最后关闭它。当第一次调用该方法时,一切都像一个符咒。不幸的是,再次调用它会触发错误“R已初始化” 初始化:“Java-R桥”;JRI“;错误:R已初始化,java,r,singleton,jri,Java,R,Singleton,Jri,我使用JRI作为Java中统计数据的计算从属。R不时需要计算,但不太频繁。因此,我决定为计算创建一个包装器方法,该方法创建一个新的REngine实例,并在最后关闭它。当第一次调用该方法时,一切都像一个符咒。不幸的是,再次调用它会触发错误“R已初始化” 初始化: private static Rengine createEngineInstance(){ //Initialise R Engine. Rengine re=new Rengine (new Str
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) 是否有机会终止重新生成并稍后再次创建新实例?这是如何正确工作的?我知道使用JRI不可能同时运行多个R线程,但这不是我的目标。
2) 如果不是这样,我将使用Singleton模式创建一个实例。在这种情况下,如何确保程序终止时R会话关闭
非常感谢你的帮助!谢谢 根据JRI Javadoc 只能使用一个Rengine实例,并且Rengine.end()函数存在一些问题 您不应该使用这样的代码
Rengine engine = new Rengine(new String[] {"--vanilla"}, false, null);
您可以将Rengine与此代码一起使用
Rengine engine = Rengine.getMainEngine();
if(engine == null)
engine = new Rengine(new String[] {"--vanilla"}, false, null);
这是一个非常古老的问题,但我想补充一点,考虑将RServe作为替代方案通常是很有吸引力的。设置较少涉及(在我看来),界面几乎相同 给出了详细的教程。(请注意,这是一个waybackmachine(存档)链接,因为原始链接已过时-加载可能有点慢,但应保持工作状态)
这还有一个额外的好处,如果你想从Java的并行线程调用
R
,你可以这样做。虽然这不是你期望的答案,但是试着使用renjin,它不使用R解释器,所以你不会有这种问题(尽管它还有其他问题…),仍然非常感谢。谢谢链接已断开。@谢谢您让我知道。我已将链接替换为“waybackmachine”链接。我也开始在这里粘贴该教程中的信息,但它相当长。希望WBM链接不会中断。