通过JRI实现java与R的连接、通信
java调用R的方式主要有两种:通过Rserver和JRI,本文重点介绍的是通过JRI实现java与R的连接、通信过程。
# 一、JRI介绍:
JRI的全名是Java/R Interface,它通过调用R的动态链接库从而利用R中的函数等。目前该项目已经成了rJava的子项目,不再提供单独的JRI的版本。
# 二、操作步骤
(1)首先需安装某一版本的R,软件下载地址:https://www.r-project.org/
(2)以R3.3.2 Patched版本为例,安装完成后,在R语言中下载与java连接所需的包rJava,命令语句:install.packages(“rJava”),选择连接的镜像:china(beijing)/china(hefei)




即:首先在Arguments中添加jri路径,其次在Enviornment中添加R语言bin文件夹的路径。 以我的电脑为例:
Arguments中添加: -Djava.library.path="D:\Program Files\R\R-3.3.2patched\library\rJava\jri\x64" Enviornment中添加:PATH D:\Program Files\R\R-3.3.2patched\bin\x64 (此处仍需要注意系统版本是64位还是32位)
三、java与R之间的通信(调用与传参)
(1)java调用R语言 测试用例(查看r版本):
package main;
import org.rosuda.JRI.Rengine;
public class Test {
public static void main(String[] args) {
try {
Rengine re = new Rengine(new String[] { "--vanilla" }, false, null);
System.out.println(re.eval("version"));
re.end();
} catch (Exception e) {
e.printStackTrace();
}
}
}```
控制台输出:
<img src="http://www.datalearner.com/resources/blog_images/e35f5d3a-1e93-487e-9318-1e6682adf064.png" alt="" loading="lazy" style="max-width: 100%; height: auto; border-radius: 0.5rem; margin: 1rem auto; display: block;" />
(2)java向R传参,R返回计算结果
Java向R传参的方式主要有两种:通过eval命令和通过assign命令。
其中eval命令是采用把R中所有语句通过re.eval的方式逐行运行,在需要传递参数的地方用参数变量替代。
例:
re.eval("source(\"\"+scriptR)") //scriptR是R脚本的路径
而assign命令则是通过java与r脚本交互的方式传递参数,在java代码中首先为需要赋值的参数赋值,然后在R脚本中设置同样的参数名称,最后利用
re.eval("source(XX.R)")的方式运行脚本。
例:
CmdSVR.java中:
```r
re.assign("input1", option.inputdata1);
re.assign("sigma", option.sigma+"");
re.assign("c",option.c+"");
re.eval("source(\"E:/Rcode/SVR-Series.R\")");
对应的R脚本是:
data<- input1 //实现传参
data<-read.xlsx(data,1)
trueSale<-data
print(trueSale)
traindata <- data[1:26,]
testdata <- data[27:32,]
sigma<-as.numeric(sigma) //实现传参
C=as.numeric(c) //实现传参
fit <- ksvm(RS~., data =traindata, kernel = "anovadot", kpar = list(sigma = sigma), C = c)
print(fit)
