3

我有这个构造函数:

public Revaluator(File model,PrintStream ps) {
    modelFile=model;
    rsession=Rsession.newInstanceTry(ps, null);
    rsession.eval("library(e1071)");
    rsession.load(modelFile);

}

我想加载一个模型并用它进行预测。Rsession.newInstanceTry(ps, null);始终是同一个会话的问题,所以如果我加载另一个模型,例如:

Revaluator re1=new Revaluator(new File("model1.RData"),System.out);
Revaluator re2=new Revaluator(new File("model2.RData"),System.out);

re1 和 re2 都使用相同的模型,因为 var name 是model,所以只加载了最后一个。

评估功能:

public REXP evaluate(Object[] arr){
    String expression=String.format("predict(model, c(%s))", J2Rarray(arr));
    REXP ans=rsession.eval(expression);
    return ans;
}
//J2Rarray just creates a string from the array like "1,2,true,'hello',false"

我需要加载大约 250 个预测变量,有没有办法将 Rsession 的每个实例作为一个新的分离 R 会​​话?

4

1 回答 1

2

modelFile您尚未在问题中粘贴所有代码,因此在尝试以下(复杂)方法之前,请排除简单原因并确保您的字段rsession未声明为静态 :-)

如果不是:

似乎创建 R 会话的方式取决于操作系统。

在 Unix 上它依赖于 R 本身的多会话能力,在 Windows 上它从端口 6311 开始并检查它是否仍然空闲。如果不是,则增加端口并再次检查它是否空闲等等。

检查空闲端口(您正在使用哪个操作系统?)可能出现问题。

您可以尝试手动配置端口并显式启动不同的本地 R 服务器,如下所示:

Logger simpleLogger = new Logger() {

        public void println(String string, Level level) {
            if (level == Level.WARNING) {
                p.print("! ");
            } else if (level == Level.ERROR) {
                p.print("!! ");
            }
            p.println(string);
        }

        public void close() {
            p.close();
        }
    };

RserverConf serverConf = new RserverConf(null, staticPortCounter++, null, null, null);
Rdaemon server = new Rdaemon(serverConf, this);
server.start(null);
rsession = Rsession.newInstanceTry(serverConf);

如果这不起作用,请显示您的Revaluator课程的更多代码并提供有关您正在运行的操作系统的详细信息。此外,应该有多个日志输出(至少在相应配置日志级别的情况下)。请同时粘贴记录的消息。

也许它还可以帮助从Google Code获取rsession的源代码并使用调试器在. 也许这可以帮助找出问题所在。Rsession.begin()

于 2013-12-03T22:38:16.367 回答