我有这个构造函数:

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名称为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 Session?

最佳答案

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

如果不是:

似乎R会话的创建方式取决于OS。

在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()中设置断点。也许这可以帮助找出问题所在。

08-19 09:52