7

我将 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)如果不是这种情况,我会使用单例模式创建一个实例。在这种情况下,如何确保程序终止时 R 会话关闭?

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

4

2 回答 2

7

根据 JRI Javadoc....

只能使用一个 Rengine Instance,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);
于 2014-06-14T19:37:43.807 回答
2

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

这里给出了详细的教程。(请注意,这是一个 Waybackmachine(存档)链接,因为原始链接已过时 - 加载可能有点慢,但应该可以继续工作)。

这具有额外的好处,如果您想R从 Java 的并行线程调用,您可以这样做。

于 2016-11-17T23:25:33.543 回答