R是統計計算的強大工具,JAVA是作應用系統的主流語言。JAVA負責系統的構建,R用來作運算引擎,從而實現應用型和分析性相結合的系統。java
Rserve是一個基於TCP/IP的服務器,經過二進制協議傳輸數據,能夠提供遠程鏈接,使得客戶端語言可以調用R。
Rserve做爲一個package發佈在CRAN上,能夠直接使用install.packages("Rserve")進行安裝。須要使用時在R控制檯下加載該包,而後輸入命令Rserve(),開啓服務器就能夠供客戶端調用。首先創建一個新的鏈接,而後就可使用eval之類的方法將R中的表達式傳到服務器端,經過R求值後傳回JAVA中REXP類型的變量,而後打印出來,整個過程很是簡單。因爲不須要對R進行初始化,所以速度會比較快。在其餘系統下能夠同時創建多個鏈接,可是在Windows下只容許同時打開一個鏈接,後續的鏈接都會共有相同的命名空間。
linux
一、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()
基本方法: Rconnection:鏈接R服務 eval():執行R語句 assgin():聲明變量 REXP: asInteger(), asIntegers(), asString(), asDouble(), asDoubles(), asList()獲取相應類型的數據
引用R架包或者添加maven配置:windows
<!--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>
//創建鏈接 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();
建立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,全名是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工程添加到工程中。
兩種方式優缺點比較:
maven
JRI(嵌入式模式)我體會到最大的優勢是它對中文的支持較好,可是使用JRI模式下很容易形成整個系統的崩潰,好比在java調用R的時候,中間出現了異常或者錯誤,這些錯誤大體都是致命的,致使java虛擬機崩潰,從而致使整個系統崩潰
Rserve(遠程通訊模式) 在這種通訊模式下,最大的優勢是javaWeb項目不須要去維護R的運行,經過TCP/IP協議直接進行通信,可是有一個很大的缺點是它對中文的支持很弱,尤爲是在windows的環境中。基本是不支持中文的,在linux環境下,彷佛對中文的支持稍微好些。不是徹底支持中文的話,對返回有中文或者輸入有中文的系統將是不可用的。
函數