JAVA负责系统的构建,R用来做运算引擎,从而实现应用型和分析性相结合的系统。增强了系统的灵活性和健壮性。
一、方式介绍
1.1内嵌模式(使用JRI)
JRI,全名是Java/R Interface,是通过调用R的动态链接库从而利用R中的函数等。通过install.packages(“rJava”)安装rJava就行,在安装文件夹中,可以看到一个jri的子文件夹,里面有自带的例子可以用来测试。过程:
-
配置JRI环境变量
-
安装rJava。 install.packages(“rJava”)
-
导入jar包。JRI.jar、REngine.jar和JRIEngine.jar
1.2远程调用模式(使用Rserve)
Rserve是一个基于TCP/IP的服务器,通过二进制协议传输数据,可以提供远程连接,使得客户端语言能够调用R。在服务端计算机安装R之后可以直接使用install.packages(“Rserve”)进行安装。需要使用时在R控制台下加载该包,然后输入命令Rserve(),开启服务器就可以供客户端调用。过程:
- 安装并配置了R语言>>
- 安装Rserve包: install.packages(“Rserve”)
- 自定义Rserve的配置文件。Rserve包被安装在R的安装目录的library文件夹下
配置项含义:
config file: Rserv.cfg 配置文件名称
working root: R运行时工作目录 /tmp/Rserv
port: 6311 通信端口
local socket: TCP/IP TCP/IP协议
authorization: 认证未开启
plain text password: 不允许明文密码
passwords file: 密码文件,未指定
allow I/O: 允许IO操作
allow remote access: 远程访问未开启
control commands: 命令控制未开启
interactive: 允许通信
max.input buffer size: 文件上传限制262mb
新建自定义Rserve配置文件Rserv.cfg(可先创建Rserv.txt添加内容后改后缀为cfg),该配置文件会覆盖Rserve的默认配置,该自定义配置项包含了一个Rserve启动脚本start.R,该脚本可用于启动Rserve时输出提示信息,新建该脚本文件并输入内容:
cat("This is my Rserve!")
print(paste("Rserve Server start at ",Sys.time()))
- 加载Rserve包:library(Rserve)
- 导入jar包REngine.jar RserveEngine.jar Rserve.jar
- Rconnection():连接R服务
- eval():执行R语句,返回REXP类型数据(其提供了asInteger(), asIntegers(), asString(), asDouble(), asDoubles(), asList()等方法将REXP类型数据转换成java相应类型的数据)
- assgin():声明变量
- 关闭Rconnection连接用rc.close();
1.3对比
Rserve:
优点是javaWeb项目不需要去维护R的运行,通过TCP/IP协议直接进行通讯。
缺点是它对中文的支持很弱,尤其是在windows的环境中,基本不支持中文;在linux环境下,对中文的支持稍微好些。不是完全支持中文的话,不能用于返回值有中文或者输入有中文的系统。
JRI:
优点是对中文的支持较好。
缺点是使用JRI模式下很容易造成整个系统的崩溃,比如在java调用R的时候,中间出现了异常或者错误,导致java虚拟机崩溃,从而导致整个系统崩溃。
二、Rserve
2.1下载地址
install.packages("Rserve", repos = "https://mirror.lzu.edu.cn/CRAN/")
# 以服务方式启动Rserve,供Java调用,默认端口号6311,日志输出文件R.out,后台启动
R CMD Rserve --RS-enable-remote --no-save> R.out 2>&1 &
2.2引入依赖
<dependency>
<groupId>org.rosuda.REngine</groupId>
<artifactId>Rserve</artifactId>
<version>1.8.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.rosuda.REngine/REngine -->
<dependency>
<groupId>org.rosuda.REngine</groupId>
<artifactId>REngine</artifactId>
<version>2.1.0</version>
</dependency>
【路径不要出现中文】
三、tidyverse包
install.packages("tidyverse", dependencies = TRUE)
报错:
解决方法:在这个目录下找到***readxl,然后删除它,重新install一下就行。可能是之前install的时候没有下载完就强制断开了。
library("tidyverse")
capabilities()
发现linux不支持这三种图片格式的画图板。
./configure --enable-R-shlib --prefix=/etc/R --with-readline=no --with-libpng --with-jpeglib
红字是不是很熟悉。
四、Java代码
RConnection rConnection = new RConnection("127.0.0.1", 6311);
REXP rexp = rConnection.eval("R.version.string");//测试连接,方法是eval(String arg0)
System.out.println(rexp.asString());// R version 3.1.2 (2014-10-31)
// 服务器中R语言脚本路径
String fileName = "D:/WorkSpace/R/template.R";
// 指定要执行的R语言脚本,需要先指定脚本
rConnection.assign("fileName", fileName);
// 向脚本中进行参数传递,只需要和脚本中的参数名称保持一致即可
rConnection.eval("myplot('data.csv','oo.pdf')");
// 执行
rConnection.eval("source(fileName)");
rConnection.close();
大功告成!