我的要求-

我需要在内部执行R scipt文件的服务器中部署Java Web服务。我搜索了各种从Java调用R的解决方案,最好的是rJava和Rserve。使用Rserve时,我可以在Windows中运行R函数BUT,因为它一次不能处理多个请求,并且我不想切换到Linux。

[编辑]

我试过了-
我已经使用rJava调用R函数:

    String[] args = new String[3];
    args[0] = "--quiet"; // Don't print startup message
    args[1] = "--no-restore"; // Don't restore anything
    args[2] = "--no-save";
    String rFilePath = "D:/Dataset_Info/AI-KMS_v2.0/tika/src/main/resources/HSConcordance.R";
    Rengine engine = new Rengine(args, false, null);
    if (!engine.waitForR()) {
        System.out.println("Cannot load R");
    }
    System.out.print("JRI R-Engine call: ");
    engine.eval("source(\"" + rFilePath + "\")");
    REXP value = engine.eval("as.integer(a<-simple())");
    int a = value.asInt();
    System.out.println(a);


Maven依赖-

    <dependency>
        <groupId>com.github.lucarosellini.rJava</groupId>
        <artifactId>JRI</artifactId>
        <version>0.9-7</version>
    </dependency>
    <dependency>
        <groupId>com.github.lucarosellini.rJava</groupId>
        <artifactId>REngine</artifactId>
        <version>0.9-7</version>
    </dependency>
    <dependency>
        <groupId>com.github.lucarosellini.rJava</groupId>
        <artifactId>JRIEngine</artifactId>
        <version>0.9-7</version>
    </dependency>


我的R脚本文件-

simple<-function(){
a=1
return(a)
}


输出-JRI R-Engine调用:1
然后挂起。我调试了它,发现它卡在了Thread.class中

任何帮助将不胜感激。

最佳答案

问题是我第二次访问该Web服务时挂起,因为我们已经存在一个在第一次调用时创建的Rengine实例。

    Rengine re = Rengine.getMainEngine();
    if(re == null){
        re=new Rengine (new String [] {"--vanilla"}, false, null);
        if (!re.waitForR())
        {
            System.out.println ("Cannot load R");
            return "failure";
        }
    }
    re.eval("source(\"" + rFilePath + "\")");
    re.eval("copyfile(\""+filePath+"\")");
    re.end();


需要注意的几点-


检查Rengine re = Rengine.getMainEngine();是否已经存在Rengine的任何实例
最后用re.end();关闭R


这可能会有所帮助。谢谢。

10-08 20:26