从Java里挪用R – 利用Rserve
前段时间先容了在Java中配置与利用JRI的要领。这种方法有一些漏洞:
Rserve可以办理这两个问题,同时也有JRI一样的易用性。它的道理是提供以HTTP方法毗连的R语言接口, 因此可以让专门一台呆板来运行RServe,然后让Java或其它语言的客户端来举办毗连。特另外长处是,可以支持Java在内的多种客户端。
Rserve推荐在Linux下利用,因为在Windows平台上还很不完善(下面会先容)。但由于大都措施员照旧习惯于在Windows情况下举办开拓,照旧有须要找到在Windows长举办它的步伐。这篇文章主要先容这个情况的话题。
安装RServe
以下以Windows平台为例先容安装的要领。Rserve可以从其网站下载单独安装,但更利便的方法是从R中直接举办安装,只需运行
install.packages(‘Rserve’)
然后,需要手动复制$R_HOME/library/rserve/Rserve*.exe到bin/i386里(视平台而定)。
运行时,在呼吁行输入:
R CMD Rserve
你会获得它乐成运行的提示。
要想封锁处事,较好的要领是从任务打点器里直接杀死rserve.exe历程。我发此刻呼吁行窗口按Ctrl-C好像有时并不能乐成封锁处事, 这个很奇怪。
利用与范围
Windows上运行Rserve照旧有很大的范围性的。
较大的问题是,所有的毗连城市在一个事情空间内运行。所以当客户端是多线程措施时,大概会造成线程间相互滋扰。我们需要在客户端做一些特另外事情,使它可以或许以线程安详的方法运行。Java端可以通过利用synchronize使得同一时间只有一个线程利用R处事。
Rserve的另一个缺点是,它的错误处理惩罚过于简朴化,假如R端呈现错误,它抛出的异常对付找到问题的来源险些没有任何用处。所以我发起R端的措施必然要多写LOG,或以统一的方法处理惩罚异常。
其次,开拓中需要留意的是,Rserve同时只答允一个客户端毗连。因此,假如第二个线程试图毗连时,它就会一直处在期待状态。别的,假如要更新R包,也需要封锁并从头启动Rserve。所以,假如发明客户端毗连时呈现异常环境,查察一下任务打点器,看是不是有多个Rserve的线程在运行,可能你的处事有没有重启,往往可以辅佐办理问题。
以下源码是一个利用Rserve实现线程安详的R处事的Java客户端。包括了用Spring设置的RService工具, 以及相关的TestNG的测试。下载后需要做一些设置和修改才气利用,不外对象较量简朴,主要是演示这个idea。
源码下载:RService.zip
示例
以下Java代码演示了利用上面zip包中的R处事工具来挪用R语言来生成图形的要领。
RService rService = new RService();
RConnection re = rService.startTransaction(); //开始独有事情空间double[][] xx = …; //生成两个二维数组
double[][] yy = …;File tempFile = null;
try {
re.assign(“x”, xx); //给R的变量赋值
re.assign(“y”, yy);
tempFile = File.createTempFile(“test-“, “.jpg”); //把图像生成到文件
String filePath = tempFile.getAbsolutePath();
logger.info(“Plot file to be produced:” + filePath);
re.eval(“jpeg(‘” + StringEscapeUtils.escapeJava(filePath) + “‘)”);
re.eval(“qqplot(x,y)”); //画图
re.eval(“dev.off()”);
} catch (IOException e) {
logger.warn(“Failed to create temp file”, e);
} finally {
this.rService.endTransaction(); //退出时必然要封锁此事情空间
}
Rserve网站已经移到RForge上:http://www.rforge.net/Rserve/