通过JRI实现java与R的连接、通信

20,828 阅读

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)

(3)下载后,在R中加载rJava,命令语句:library(rJava) (4)在java项目中加载3个jar包:JRI.jar 、JRIEngine.jar 、 REngine.jar, 包下载地址:http://www.rforge.net/JRI/files/ (5)设置系统环境和加载路径,首先设置系统环境变量,在path后加上:jri.dll的地址,比如我的jri.dll地址在: D:\Program Files\R\R-3.3.2patched\library\rJava\jri\x64\jri.dll (此处需注意系统版本是64位还是32位,以确保路径正确)
其次设置eclipse项目的Run Configurations:

即:首先在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)

DataLearner 官方微信

欢迎关注 DataLearner 官方微信,获得最新 AI 技术推送

DataLearner 官方微信二维码