一种混合编程技术在宏观经济监测预警系统中的应用

2018-01-28 23:16许传本
电子技术与软件工程 2017年18期
关键词:R语言

许传本

摘要

R语言具有强大的数据处理功能,Java语言广泛应用于数据库应用系统的开发,两者互补结合的混合编程在工程实践中具有重要的意义。本文以某市宏观经济监测预警系统为背景,从Java调用R语言两种方式的角度,深入研究了它们之间混合编程的原理和实现机制,并且给出了具体条件下的混合编程方法和步骤。

【关键词】R语言 混合编程 Java

1引言

R语言是一款可以对数据进行统计分析的开源软件包,同时也是一個可以进行交互数据分析平台。它提供时间序列分析方法和图形技术,具有高度可拓展。R语言内置包括统计分析、数据可视化在内的有丰富的内置的功能,这些功能给在数值计算、金融应用、工业系统仿真等领域得到了广泛的应用。进入大数据时代,R语言成为数据挖掘领域的重要工具。JAVA是面向对象编程语言,它具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点,但JAVA语言在数值计算方面的能力却不突出,特别是对数组矩阵数据的处理速度缓慢。

在本文中的宏观经济预警监测系统是基于Java语言开发的,系统在不同的阶段调用R编写的预测模型获得预测结果并展示,这样充分利用R语言在统计分析方面的优势,降低程序设计的复杂度;同时也产生了R和Java混合编程的问题。因此,本文基于R和Java语言开发环境Eclipse,在Windows平台下就它们之间的混合编程问题从JAVA调用R语言的方式进行深入研究并举例说明。

2R安装及配置

(1)下载安装R在R官网的CRAN站点选择下载R语言安装程序R-3.4.1-win.exe,并运行安装程序。Rgui.exe作为标准WindowsGUI可执行文件,并提供R控制台在自己的窗口。

(2)配置forecast包R语言是以软件包的形式提供不同的功能,forecast包提供了时间序列预测分析法,其中包括指数平滑、自动ARIMA建模等预测模型。

3Java调用R语言

Java调用R语言的方式主要有两种:JRI调用和Rserve调用。

3.1JRI调用

JRI是一个Java/R接口,是用于java调用R语言的软件包,可以将Java内部的R程序作为单个线程运行。它将R动态链接库加载到Java中,同时可以为R功能提供JavaAPI。它支持对R函数的简单调用和完全运行的REPL。使用JRI需要在R里安装rJava扩展包。目前JRI己经被包含在rJava中。JRI配置需要3个步骤:

(1)运行RGUIwindow程序,在R控制台输入命令installed.packages(“rJava”)下载rJava包到R-3.4.1的library文件夹下rJava子文件夹。rJava的子文件夹jri有4个文件:jri.DLL、JRI.jar、JRIEngine.jar、REngine.jar,其中jri.DLL为动态链接库文件,用于连接RGUI本地库文件;而JRLjar、JRIEngine.jar、REnginejar3个用于java编写调用R的客户端程序。

(2)在系统变量Path添加jri.DLL的文件路径;在系统变量Classpath加上JRI.jar文件路径。

(3)在web项目中lib中加入JRI.jar,JRIEngine.jar,REngine.jar。

JRI调用过程是:Java客户端实例化,通过挂接到调用此构造函数的现有的初始化R实例来创建新引擎;调用引擎实例的eval()方法解析预测模型R表达式并返回结果。

己知某市2008-2010年12个月的GDP产值进行HoltWinter三参数指数平滑,并预测下一年12个月的产值的R算法实现的源代码文件forecast.R,文件内容如下:

library(forecast)

x<-1234568159627769090117154040

401009105512123259

3133561371411152251025487418528159627769090117154040

401009105512123259313356137141115225102548081596277690

90117154040401009105512123259313356137141115225102548train<-scan(text=x)

timeseriesl<-ts(train,frequency=12,start

=c(2008,l))

timeseries2<-HoltWinters(timeseries1)

下面以JRI调用R算法实现源代码为例,说明JRI调用的步骤和过程:

PublicclassJRIClientForHgimplements

RMainLoopCallbacks{

Publicstaticvoidmain(String[]args){

Renginere=newRengine(a

rgs,tme,newJRIClientForHg());//创建R计算引

if(!re.waitFor()){return;}

re.eval("source("d:\\

forecast.R")");//加载R算法模型

double[]results=re.

eval("timeseries2$fitted").asDoubleArray();//预测结果endprint

}}

此方法可以实现Java与R语言之间的调用。其优点是高效,缺点是紧耦合,扩展受限,过度依赖rJava的版本,接口程序无法重用。

3.2Rserve调用

Rserve是一个基于TCP/IP协议的,允许R语言与其他语言(如C/C++,Java、PHP等)通信的C/S結构的程序。在本文的宏观经济预警系统中,不同的时间段对经济指标进行统计建模并返回的结果作为业务系统数据可视化的数据源,Rserve可以将R内置的强大的计算功能以后台服务的形式供异构平台调用。使用Rserve实现Java语言与R的通信需要3个步骤:

(1)在RGUI的R控制台输入指令install.packages(”Rserve”),下载安装Rserve包。

(2)在RGUI的R控制台输入指令Rserve(),出现StartingRserve提示说明启动Rserve成功。

(3)编写Java客户端,将REngine.jar、RserveEngine.jar添加到java项目的编译路径中。

启动Rserve服务是实现Rserve调用的前提条件,启动服务是通过在R控制台中执行Rserve()语句来单独启动一个守护进程作为Rserve实例,其默认端口6311。Java客户端通过实例化RConnection对象与Rserve实例建立TCP/IP连接,预测模型的R语言算法实现源码内容转化字符串作为RConnection对象的eval方法实参传入,由R计算引擎解析、编译并返回计算结果。

下面以Rserve方式调用R算法实现源代码为例,说明调用的步骤和过程:

PublicclassRserveClientForHg{

Publicstaticvoidmain(String[]args){

RConnectionrc=new

RConnection();//创建RConnection对象

rc.eval("source(d:\forecast.

R)");//加载R算法模型

double[]results=rc.

eval(”timeseries2$fitted").asDoubles();//预测结果

}

4结论

在本文中,以上介绍了R语言和JAVA在native环境和网络环境上混合编程方法,并通过实例介绍了如何实现R语言和JAVA混合编程,着重讲了混合编程的关键之处在于数据的传输,通过混合编程可以降低程序设计复杂度,同时提高程序的运行速度。由此可见使用不同编程语言进行混合编程,可以充分各语言的优点,优化了程序设计,提高软件运行效率,混合编程将会有更大的现实意义和发展空间,基于Rserve的远程调用方式实现R语言和JAVA混合编程具有优势。

参考文献

[1]李国军.基于R语言多元分析的教育统计应用研究[J].鞍山师范学院学报,2015,04,17(02):69-74.

[2]夏成锋.基于COM及Java-COM桥的Java与Matlab混合编程[J].现代计算机,2015-12:100-102.

[3]徐启猛.交互式语言开发工具的设计与实现[D].吉林大学硕士学位论文,2011.

[4]王燕.时间序列分析-基于R[M].北京:中国人民大学出版社,2015(09):01.endprint

猜你喜欢
R语言
基于GPS轨迹数据进行分析改善城市交通拥挤
基于R语言的Moodle平台数据挖掘技术的研究
注重统计思维培养与应用为主导的生物统计学课程建设