R是統計計算的強大工具,JAVA是做應用系統的主流語言。JAVA負責系統的構建,R用來做運算引擎,從而實現應用型和分析性相結合的系統。
一、Rserve(遠程通信模式)
Rserve是一個基於TCP/IP的服務器,通過二進制協議傳輸數據,可以提供遠程連接,使得客戶端語言能夠調用R。
Rserve作為一個package發布在CRAN上,可以直接使用install.packages("Rserve")進行安裝。需要使用時在R控制台下加載該包,然后輸入命令Rserve(),開啟服務器就可以供客戶端調用。首先建立一個新的連接,然后就可以使用eval之類的方法將R中的表達式傳到服務器端,通過R求值后傳回JAVA中REXP類型的變量,然后打印出來,整個過程非常簡單。由於不需要對R進行初始化,因此速度會比較快。在其他系統下可以同時建立多個連接,但是在Windows下只允許同時打開一個連接,后續的連接都會共有相同的命名空間。
1、Rserve安裝和啟動(windows環境)
方法一:前提:安裝並配置了R語言
第一次啟動安裝Rserve包:
install.packages("Rserve")
第一次啟動加載Rserve包:
library(Rserve)
啟動Rserve服務:
Rserve()
關閉Rconnection連接:
關閉Rconnection連接用rc.close();
方法二:點擊R工具欄上的“程序包”--》“設定CRAN鏡像”--》China(xxx) —》確定
點擊【程序包】—》安裝程序包—》選擇 rJava —>OK
點擊【程序包】—》安裝程序包—》選擇 Rserve —>OK
點擊【程序包】—》加載程序包—》選擇 rJava —>OK
點擊【程序包】—》加載程序包—》選擇 Rserve —>OK
安裝命令:install.packages("packageName")
加載命令:library(packageName)
啟動命令:Rserve()
2.Java調用R
基本方法:
Rconnection:連接R服務
eval():執行R語句
assgin():聲明變量
REXP:
asInteger(), asIntegers(), asString(), asDouble(), asDoubles(), asList()獲取相應類型的數據
引用R架包或者添加maven配置:
<!--REngine Java Interface to R --> <dependency> <groupId>org.rosuda.REngine</groupId> <artifactId>REngine</artifactId> <version>2.1.0</version> </dependency> <dependency> <groupId>org.rosuda.REngine</groupId> <artifactId>Rserve</artifactId> <version>1.8.1</version> </dependency>
實例1:求一個數組里面的最大值
//建立連接 RConnection rc=new RConnection(); //構建數據 int[] datas={314,451,56,24,631}; //聲明變量,相當於在R命令行中輸入data<-datas命令 rc.assign("data",datas); //執行R語句,相當於在R命令行中輸max(data)命令 REXP rexp=rc.eval("max(data)"); //REXP. asXxx()返回相應類型的數據,如果結果類型不符會出錯 System.out.println(rexp.asInteger()); rc.close();
實例2:調用自定義函數
創建R文件test.R
myFunc<-function(data){
x<-data+2;
}
RConnection rc = new RConnection(); // test.R的路徑 String fileName = "D:\\test.R"; rc.assign("fileName", fileName); //執行test.R腳本,執行這一步才能調用里面的自定義函數myFunc,如果不行,就在R工具上也執行一下test.R腳本 rc.eval("source(fileName)"); String num = "3"; //調用myFunc函數 REXP rexp=rc.eval("myFunc("+num+")"); //返回類型是一個整數類型,所以用asInteger System.out.println(rexp.asInteger()); rc.close();
在R-x.x.x\library\Rserve\client\java\Rserve\test目錄下有測試用例可以參考。(StartRserve.java是用java啟動Rserve服務,而不用打開R語言來手動啟動。test.java里包含了基本方法的調試)
二、JRI(嵌入式模式)
JRI,全名是Java/R Interface,是通過調用R的動態鏈接庫從而利用R中的函數等。通過install.packages("rJava")安裝rJava就行,在安裝文件夾中,可以看到一個jri的子文件夾,里面有自帶的例子可以用來測試。
配置環境變量:在PATH中添加%R_HOME%/bin和%R_HOME%/library/rJava/jri,注意R_HOME的路徑要正確。
安裝rJava
install.packages("rJava")
設置環境變量: PATH后添加 %R_HOME%\library\rJava\jri
獲取jar包:把安裝目錄jri文件夾下的JRI.jar、REngine.jar和JRIEngine.jar放進Java工程添加到工程中。
兩種方式優缺點比較:
JRI(嵌入式模式)我體會到最大的優點是它對中文的支持較好,但是使用JRI模式下很容易造成整個系統的崩潰,比如在java調用R的時候,中間出現了異常或者錯誤,這些錯誤大致都是致命的,導致java虛擬機崩潰,從而導致整個系統崩潰
Rserve(遠程通信模式) 在這種通信模式下,最大的優點是javaWeb項目不需要去維護R的運行,通過TCP/IP協議直接進行通訊,但是有一個很大的缺點是它對中文的支持很弱,尤其是在windows的環境中。基本是不支持中文的,在linux環境下,似乎對中文的支持稍微好些。不是完全支持中文的話,對返回有中文或者輸入有中文的系統將是不可用的。