2013-11-25 56 views
3

我有这样的构造:如何在Java中使用R模型来预测多个模型?

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并使用相同的模型,因为变量名称是model,所以只有最后一个加载RE2。

的评价功能:

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对话?

+1

很好的问题! – gran33

回答

1

您还没有贴上所有的代码在你的问题,所以尝试(复杂)远低于之前,请排除简单的原因,并确保您的领域modelFilersession不声明为static :-)

如果不是:

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

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

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

你可以尝试手动配置端口和显式启动不同的本地研发的服务器是这样的:

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()。也许这可以帮助搞清楚出了什么问题。

+0

在OSX上开发,生产是UBUNTU,无论如何,工作,thanx! – Dima

相关问题