Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“Java-R桥”;JRI“;错误:R已初始化_Java_R_Singleton_Jri - Fatal编程技术网

“Java-R桥”;JRI“;错误: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

我使用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) 是否有机会终止重新生成并稍后再次创建新实例?这是如何正确工作的?我知道使用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链接不会中断。