向模軍 岐世峰


摘? 要: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-),男,漢族,山西臨猗人,教授,本科,研究方向:物聯網技術及應用。