Java-R bridge" JRI"错误:R已初始化

时间:2014-05-09 10:53:31

标签: java r singleton 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;
}

包装方法:

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会话关闭?

非常感谢您的帮助!谢谢!

2 个答案:

答案 0 :(得分:7)

根据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);

答案 1 :(得分:2)

很老的问题,但我想补充一点,考虑到RServe作为替代方案通常很有吸引力。设置较少涉及(在我看来),界面几乎相同。

给出here的详细教程。

如果你想从Java的并行线程调用R,你还可以获得额外的好处。