R是统计计算的强大工具,而JAVA是做应用系统的主流语言,两者天然具有整合的需要。关于整合,一方面,R中可以创建JAVA对象调用JAVA方法,另一方面,JAVA中可以转换R的数据类型调用R的函数,互相取长补短。现在也有一个项目JGR,用JAVA做R的图形界面,可以实现高亮显示自动补全等,还能让JAVA和R互相调用。
关于R中调用JAVA,我想主要是为了利用其面向对象的特性,毕竟R语言近来很致力于向面向对象发展,有个很好的项目rJava可以实现,在www.rforge.net/rJava上。R中调JAVA对我似乎意义不大,本文主要介绍JAVA中调用R。所有测试都在Windows XP、R2.10.1和JDK1.6下完成。
JAVA很适合开发应用系统,但是数学建模和计算能力非其所长,如果该系统需要进行大量的统计或者优化的计算,调用R是一种很好的方式。JAVA负责系统的构建,R用来做运算引擎,从而实现应用型和分析性相结合的系统。
首先要介绍的是Rserve的方式,这是一个基于TCP/IP的服务器,通过二进制协议传输数据,可以提供远程连接,使得客户端语言能够调用R。目前Rserve作为一个package发布在CRAN上,可以直接使用install.packages(“Rserve”)进行安装。需要使用时在R控制台下加载该包,然后输入命令Rserve(),开启服务器,就可以供客户端调用。
其客户端可以有多种,这里只介绍JAVA客户端。最早的客户端包是JRclient,在www.rosuda.org/Rserve上还可以下载到,但是现在该项目全部移到了www.rforge.net/Rserve,使用REngine作客户端(和JRI一致),在该网站下可以下载到REngine.jar和RserveEngine.jar两个文件。如果用eclipse开发的话,在工程属性中导入这两个外部的jar包,就可以正常使用了。
//java连接R先导包(两个)
RConnection c = new RConnection();
REXP x = c.eval(“R.version.string”);
System.out.println(x.asString());
String [] s={"adada","addadada","asddsadq"};
c.assign("x", s);
// REXP res = c.eval(“paste(x[1],x[2],sep=’
′)”);//System.out.println(res.asString());c.voidEval(“m=paste(x[1],x[2],sep=′
’)”);
System.out.println(c.eval(“m”).asString());
/*
*
* c.assign("x", dataX);
c.assign("y", dataY);
RList l = c.eval("lowess(x,y)").asList();
double[] lx = l.at("x").asDoubles();
double[] ly = l.at("y").asDouble();
*
*
*
* */
/*
*
c.assign(y, ...) ...
c.voidEval("m<-lm(y~a+b+c)");
*/