我有这个构造函数:
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?
最佳答案
您尚未在问题中粘贴所有代码,因此在尝试以下(复杂)方法之前,请排除简单原因,并确保您的字段modelFile
和rsession
未声明为静态:-)
如果不是:
似乎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()
中设置断点。也许这可以帮助找出问题所在。