Chr*_*ris 7 java singleton r jri
我正在使用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;
}
Run Code Online (Sandbox Code Playgroud)
包装方法:
public static void performR(){
//Create instance of R engine
Rengine re = createEngineInstance();
//Perform some R operations
re.eval("...");
re.end();
}
Run Code Online (Sandbox Code Playgroud)
显然,REngine实例未正确终止.因此,我需要知道:1)是否有机会终止REngine并再次创建新实例?这是如何正常工作的?我知道用JRI同时运行多个R线程是不可能的,但这不是我的目标.2)如果不是这种情况,我会使用Singleton模式创建一个实例.在这种情况下,如何确保在程序终止时R会话关闭?
非常感谢您的帮助!谢谢!
根据JRI Javadoc ....
只能使用一个Rengine实例,而Rengine.end()函数有一些问题......
你不应该使用这样的代码
Rengine engine = new Rengine(new String[] {"--vanilla"}, false, null);
Run Code Online (Sandbox Code Playgroud)
您可以使用此代码使用Rengine
Rengine engine = Rengine.getMainEngine();
if(engine == null)
engine = new Rengine(new String[] {"--vanilla"}, false, null);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1539 次 |
| 最近记录: |