Java調(diào)用R語(yǔ)言實(shí)例講解
R是統(tǒng)計(jì)計(jì)算的強(qiáng)大工具,JAVA是做應(yīng)用系統(tǒng)的主流語(yǔ)言。JAVA負(fù)責(zé)系統(tǒng)的構(gòu)建,R用來(lái)做運(yùn)算引擎,從而實(shí)現(xiàn)應(yīng)用型和分析性相結(jié)合的系統(tǒng)。
一、Rserve(遠(yuǎn)程通信模式)
Rserve是一個(gè)基于TCP/IP的服務(wù)器,通過(guò)二進(jìn)制協(xié)議傳輸數(shù)據(jù),可以提供遠(yuǎn)程連接,使得客戶端語(yǔ)言能夠調(diào)用R。
Rserve作為一個(gè)package發(fā)布在CRAN上,可以直接使用install.packages("Rserve")進(jìn)行安裝。需要使用時(shí)在R控制臺(tái)下加載該包,然后輸入命令Rserve(),開(kāi)啟服務(wù)器就可以供客戶端調(diào)用。首先建立一個(gè)新的連接,然后就可以使用eval之類的方法將R中的表達(dá)式傳到服務(wù)器端,通過(guò)R求值后傳回JAVA中REXP類型的變量,然后打印出來(lái),整個(gè)過(guò)程非常簡(jiǎn)單。由于不需要對(duì)R進(jìn)行初始化,因此速度會(huì)比較快。在其他系統(tǒng)下可以同時(shí)建立多個(gè)連接,但是在Windows下只允許同時(shí)打開(kāi)一個(gè)連接,后續(xù)的連接都會(huì)共有相同的命名空間?!?/p>
1、Rserve安裝和啟動(dòng)(windows環(huán)境)
方法一:前提:安裝并配置了R語(yǔ)言
第一次啟動(dòng)安裝Rserve包:
install.packages("Rserve")
第一次啟動(dòng)加載Rserve包:
library(Rserve)
啟動(dòng)Rserve服務(wù):
Rserve()
關(guān)閉Rconnection連接:
關(guān)閉Rconnection連接用rc.close()
;
方法二:點(diǎn)擊R工具欄上的“程序包”--》“設(shè)定CRAN鏡像”--》China(xxx) —》確定
點(diǎn)擊【程序包】—》安裝程序包—》選擇 rJava —>OK
點(diǎn)擊【程序包】—》安裝程序包—》選擇 Rserve —>OK
點(diǎn)擊【程序包】—》加載程序包—》選擇 rJava —>OK
點(diǎn)擊【程序包】—》加載程序包—》選擇 Rserve —>OK
安裝命令:install.packages("packageName")
加載命令:library(packageName)
啟動(dòng)命令:Rserve()
2.Java調(diào)用R
基本方法:
Rconnection
:連接R服務(wù)
eval()
:執(zhí)行R語(yǔ)句
assgin()
:聲明變量
REXP
:
asInteger(), asIntegers(), asString(), asDouble(), asDoubles(), asList()
獲取相應(yīng)類型的數(shù)據(jù)
引用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>
實(shí)例1:求一個(gè)數(shù)組里面的最大值
//建立連接 RConnection rc=new RConnection(); //構(gòu)建數(shù)據(jù) int[] datas={314,451,56,24,631}; //聲明變量,相當(dāng)于在R命令行中輸入data<-datas命令 rc.assign("data",datas); //執(zhí)行R語(yǔ)句,相當(dāng)于在R命令行中輸max(data)命令 REXP rexp=rc.eval("max(data)"); //REXP. asXxx()返回相應(yīng)類型的數(shù)據(jù),如果結(jié)果類型不符會(huì)出錯(cuò) System.out.println(rexp.asInteger()); rc.close();
實(shí)例2:調(diào)用自定義函數(shù)
創(chuàng)建R文件test.R myFunc<-function(data){ x<-data+2; }
RConnection rc = new RConnection(); // test.R的路徑 String fileName = "D:\\test.R"; rc.assign("fileName", fileName); //執(zhí)行test.R腳本,執(zhí)行這一步才能調(diào)用里面的自定義函數(shù)myFunc,如果不行,就在R工具上也執(zhí)行一下test.R腳本 rc.eval("source(fileName)"); String num = "3"; //調(diào)用myFunc函數(shù) REXP rexp=rc.eval("myFunc("+num+")"); //返回類型是一個(gè)整數(shù)類型,所以用asInteger System.out.println(rexp.asInteger()); rc.close();
在R-x.x.x\library\Rserve\client\java\Rserve\test目錄下有測(cè)試用例可以參考。(StartRserve.java是用java啟動(dòng)Rserve服務(wù),而不用打開(kāi)R語(yǔ)言來(lái)手動(dòng)啟動(dòng)。test.java里包含了基本方法的調(diào)試)
二、JRI(嵌入式模式)
JRI,全名是Java/R Interface,是通過(guò)調(diào)用R的動(dòng)態(tài)鏈接庫(kù)從而利用R中的函數(shù)等。通過(guò)install.packages("rJava")安裝rJava就行,在安裝文件夾中,可以看到一個(gè)jri的子文件夾,里面有自帶的例子可以用來(lái)測(cè)試。
配置環(huán)境變量:在PATH中添加%R_HOME%/bin和%R_HOME%/library/rJava/jri,注意R_HOME的路徑要正確。
安裝rJava
install.packages("rJava")
設(shè)置環(huán)境變量:PATH后添加 %R_HOME%\library\rJava\jri
獲取jar包:把安裝目錄jri文件夾下的JRI.jar、REngine.jar和JRIEngine.jar放進(jìn)Java工程添加到工程中?! ?/p>
兩種方式優(yōu)缺點(diǎn)比較:
JRI(嵌入式模式)我體會(huì)到最大的優(yōu)點(diǎn)是它對(duì)中文的支持較好,但是使用JRI模式下很容易造成整個(gè)系統(tǒng)的崩潰,比如在java調(diào)用R的時(shí)候,中間出現(xiàn)了異?;蛘咤e(cuò)誤,這些錯(cuò)誤大致都是致命的,導(dǎo)致java虛擬機(jī)崩潰,從而導(dǎo)致整個(gè)系統(tǒng)崩潰
Rserve(遠(yuǎn)程通信模式) 在這種通信模式下,最大的優(yōu)點(diǎn)是javaWeb項(xiàng)目不需要去維護(hù)R的運(yùn)行,通過(guò)TCP/IP協(xié)議直接進(jìn)行通訊,但是有一個(gè)很大的缺點(diǎn)是它對(duì)中文的支持很弱,尤其是在windows的環(huán)境中?;臼遣恢С种形牡模趌inux環(huán)境下,似乎對(duì)中文的支持稍微好些。不是完全支持中文的話,對(duì)返回有中文或者輸入有中文的系統(tǒng)將是不可用的。
到此這篇關(guān)于Java調(diào)用R語(yǔ)言實(shí)例講解的文章就介紹到這了,更多相關(guān)Java調(diào)用R語(yǔ)言內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于R語(yǔ)言lubridate包處理時(shí)間數(shù)據(jù)的問(wèn)題
這篇文章主要介紹了關(guān)于R語(yǔ)言lubridate包處理時(shí)間數(shù)據(jù)的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-05-05R語(yǔ)言中cut()函數(shù)的用法說(shuō)明
這篇文章主要介紹了R語(yǔ)言中cut()函數(shù)的用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04R語(yǔ)言編程學(xué)習(xí)從Github上安裝包解決網(wǎng)絡(luò)問(wèn)題
這篇文章主要為大家介紹了R語(yǔ)言編程從Github上安裝包的過(guò)程詳解,這樣可以解決很多網(wǎng)絡(luò)問(wèn)題,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-11-11R語(yǔ)言可視化存儲(chǔ)矢量圖實(shí)現(xiàn)方式
這篇文章主要為大家介紹了R語(yǔ)言存儲(chǔ)矢量圖的實(shí)現(xiàn)方式過(guò)程,有需要的朋友可以借鑒參考下,希望能夠有所你幫助,祝大家多多進(jìn)步,早日升職加薪2021-11-11R語(yǔ)言創(chuàng)建矩陣的實(shí)現(xiàn)方法
這篇文章主要介紹了R語(yǔ)言創(chuàng)建矩陣的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03R語(yǔ)言關(guān)聯(lián)規(guī)則深入詳解
這篇文章主要介紹了R語(yǔ)言關(guān)聯(lián)規(guī)則深入詳解,文中內(nèi)容講解的很透徹,有感興趣的同學(xué)可以學(xué)習(xí)下2021-03-03