APP下载

利用Rserve实现Java调用R脚本

2019-09-10向模军岐世峰

现代信息科技 2019年7期

向模军 岐世峰

摘  要:Java调用R,是弥补Java缺乏数据分析和可视化能力的一种解决方案,从而构建应用型和分析性相结合的系统。文章给出了三种Java调用R脚本的途径,即:进程方式、嵌入式模式JRI、远程调用模式Rserve,研究了它们的实现机制,给出了相应的编程方法,在实际应用中推荐使用Rserve远程调用模式。

关键词:Java;R;Rserve;JRI

中图分类号:TP312.2      文献标识码:A 文章编号:2096-4706(2019)07-0090-03

Abstract:Java Call R,a solution to compensate for Java lack of data analysis and visualization capability,so as to build systems that combine application and analysis. This paper presents three ways of Java calling R script,namely:process mode,embedded mode JRI and remote mode Rserve. It studies their implementation mechanism,gives the corresponding programming method,and recommends using Rserver remote mode in practical application.

Keywords:Java;R;Rserve;JRI

0  引  言

Java作为主流的应用软件开发语言,极好地实现了面向对象理论,已经被广泛应用到各种项目中,但Java缺乏数据分析以及可视化的能力。R是集统计分析与图形显示于一体的编程语言,可以用来进行机器学习,数据挖掘和数据可视化。Java和R,两者天然具有整合的需要,可以互相取长补短,Java负责系统的构建,R用来做分析引擎,通过整合,将R的数据分析结果在Java应用程序中展现,从而实现应用型和分析性相结合的系统。

1  异构语言的相互调用

需要说明的是,在微服务架构大行其道的今天,不应该提倡程序之间的相互调用,因为增加了耦合复杂度,而且相互调用的效率肯定不高。但或许是由于历史原因,或许是由于特定条件,需要异构语言的交互访问,需要优势互补的混合编程,各种开发环境也提供了插件、程序包、接口等工具或技术来适应这种情况,比如Java与C++之间可以通过JNI来实现,Java与Python之间可以通过Jython来实现。

除此之外,也可以采用“轮询”方式实现相互调用,将参数标准化后,保存在共享存储中,两种不同语言的内存进程,一方写数据,一方读数据,轮回进行,这应该是最简单的实现方式。

“轮询”方式效率偏低,高级语言纷纷支持Socket通信。把需要传递的参数,以Socket报文方式发送到服务端,服务端执行完成后,再把返回结果以报文方式发送给调用端,这种Socket Server/Client方式也是通用的。

由于Socket套接字长度有限制,无法适用于更加复杂的场合,故而一种跨编程语言和跨操作系统平台的远程调用技术Web Service出现了。利用这一技术,只要按照规范就可以实现跨语言调用,调用使用的是HTTP协议,传输的数据格式是XML,无须借助第三方就可实现数据交互等。

2  Java调用R脚本

Java很适合开发应用系统,但统计分析生成图表非其所长,如果Java应用系统需要进行大量的统计并且可视化,调用R是一种很好的方式。一个大数据系统有这么一种应用需求:在Web界面上展示统计分析图形,一种比较好的解决方案:Web部分用Java/JSP技术来实现,用R来做数据分析生成图形,通过整合,实现Java对R的调用,如图1所示。

2.1  进程方式

R开发环境提供了一个可执行文件Rscript.exe,可以在OS终端运行R脚本。命令格式:Rscript <文件路径 R脚本文件名> [参数列表]。注意所调用的*.R文件应该在R的工作目录下,另外就是参数之间用空格隔开。

在Java中,如果需要调用系统外部的某个程序或命令,可以用Runtime.exec()来实现,它会生成一个新的进程去运行,这样说来,用Rscript执行文件的操作,可以移到Java代码中实现。代码如下:

使用JRI,需要提前做好三步:

(1)R中需要安装rJava包:installed.packages ("rJava")。

(2)配置系统变量Path、Classpath:Path添加jri.DLL文件路径,Classpath添加JRI.jar文件路径。

(3)Java工程中引入JRI.jar、JRIEngine.jar、REngine.jar。

在rJava包安装目录下的jri/examples里有现成的例子,加入Java项目测试,如果执行成功,表示配置完成。

2.3  远程调用模式Rserve

Rserve是一个基于TCP/IP协议的,允許其他语言与R语言通信的C/S结构的程序包,支持C/C++、PHP、Java、Python等。

如果要使用Rserve,需要先完成以下工作:

(1)安装Rserve:install.packages("Rserve")。

(2)加载Rserve:library("Rserve")。

(3)启动并打开远程连接模式:Rserve --RS -enable -remote。

(4)Java工程中引入REngine.jar、RserveEngine.jar。

要在Java项目中调用R脚本,生成分析图形,代码如下:

3  结  论

在本文中,介绍了Java调用R脚本的三种方法,各有优缺点,如表1所示。

在我们的实际应用中使用的是Rserve,也推荐使用Rserve远程调用模式,虽然不支持中文,但只要项目本身的参数传递没有中文就可以了。这样的方式保证了Java Web系统与R的维护相对独立,增强了系统的灵活性和健壮性。

参考文献:

[1] 向模军.利用JNI实现Java与C++通信 [J].计算机时代,2009(12):56-57.

[2] 张魁,张粤磊,刘未昕,等.自己动手做大数据系统 [M].北京:电子工业出版社,2016(10):145-151.

[3] 许传本.一种混合编程技术在宏观经济监测预警系统中的应用 [J].电子技术与软件工程,2017(18):167-168.

[4] 张炀,汪洋,程韧俐,等.电力系统负荷预测软件中R语言与Java的接口方法研究 [J].企业技术开发,2017,36(8):59-60.

[5] 赵升枝,仲梁维.基于微信平台的共享存储柜系统的设计与实现 [J].软件工程,2018,21(10):38-42.

[6] 宫薇薇,齐向春,裴世廉.Python与R语言混合编程方法的研究和应用 [J].计算机应用与软件,2018,35(1):28-31.

[7] 向模军,岐世峰,陈荣.利用Java开发ASP组件 [J].商场现代化,2007(29):13-14.

[8] 曹杰.基于JVM的R语言海量数据统计集成框架研究 [D].武漢:华中科技大学,2012.

[9] 张佳进,陈立畅,陈克平,等.基于R语言的农业试验统计软件的设计与实现 [J].电子设计工程,2014,22(14):10-12.

[10] 胡瑞娟.大数据架构下的热词发现与可视化技术研究 [J].软件工程,2018,21(5):1-3.

作者简介:向模军(1974-),男,汉族,四川江油人,副教授,硕士,研究方向:Web挖掘;岐世峰(1964-),男,汉族,山西临猗人,教授,本科,研究方向:物联网技术及应用。