許傳本
摘要
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