第一次写博客,就记录最近因业务需求接触到的rJava。
众所周知,JAVA以其面向对象的思维能够快速构建系统应用,也正因为如此数学建模和计算能力非其所长,如果该系统需要进行大量的统计或者优化的计算,调用R是一种很好的方式。
首先要保证本机或者有一台服务器作为R运行环境,R安装包可从https://mirrors.tuna.tsinghua.edu.cn/CRAN/ 选择下载对应系统的安装包,当前最新版本R-3.4.3。
安装好后,打开R可视化窗口,相关demo可以输入demo()查看,查询帮助help()
,
若对R感兴趣可自行深入学习,这不做细讲。我们先编写一个测试R脚本,打开 文件->选择新建程序脚本,
保存一指定路径,本文保存在D盘目录下。
在R可视化窗口中测试下R脚本,引入刚才的R脚本 source("D:/test.R"),调用方法test.func(3,2),可以看到测试脚本方法返回结果
。
好了,我们现在尝试用Java调用R,这里我只介绍RServe方法调用R。
先在R服务器上执行命令install.packages("Rserve")安装Rserve,然后引入Rserve框架library(Rserve),最后启动Rserve(),出现下面返回则表示Rserve已成功启动
。
Java程序中引入所需的REngine.jar和Rserve.jar两个jar包,或则maven引入
<dependency>
<groupId>org.rosuda.REngine</groupId>
<artifactId>Rserve</artifactId>
<version>1.8.1</version>
</dependency
最后Java调用R
private RConnection rTestCon = null;
private RConnection getInitRserve() throws RserveException {
if(rTestCon == null) {
// rServerIP 为R运行的服务器ip,若为本机直接new RConnection()
rTestCon = new RConnection(rServerIP);
String rStoreFile = "D:/test.R";
rTestCon.eval("source('"+rStoreFile+"')");
}
return rTestCon;
}
@Test
public void test() throws RserveException, REXPMismatchException {
RConnection rTestCon = getInitRserve();
int tmp0 = 1;
int tmp1 = 2;
REXP rexp = rTestCon.eval("test.func("+tmp0+","+tmp1+")");
System.out.println(rexp.asDouble());
}
运行代码,控制台输出
好了大功告成,第一次使用R,如有理解有误的地方忘大神留言指出。