本篇內(nèi)容介紹了“Java程序怎么通過Rserve遠(yuǎn)程調(diào)用R”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成! 本篇內(nèi)容介紹了“Java程序怎么通過Rserve遠(yuǎn)程調(diào)用R”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
成都創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括青海網(wǎng)站建設(shè)、青海網(wǎng)站制作、青海網(wǎng)頁(yè)制作以及青海網(wǎng)絡(luò)營(yíng)銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,青海網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到青海省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
Rserve介紹
Rserve是一個(gè)基于TCP/IP協(xié)議的,允許R語(yǔ)言與其他語(yǔ)言通信的C/S結(jié)構(gòu)的程序,支持C/C++,Java,PHP,Python,Ruby,Nodejs等。 Rserve提供遠(yuǎn)程連接,認(rèn)證,文件傳輸?shù)裙δ堋N覀兛梢栽O(shè)計(jì)R做為后臺(tái)服務(wù),處理統(tǒng)計(jì)建模,數(shù)據(jù)分析,繪圖等的任務(wù)。
詳細(xì)介紹請(qǐng)參照官方網(wǎng)站:https://rforge.net/Rserve/
Rserve安裝
注意:安裝Rserve前需要安裝R,我安裝的是 R-3.1.2-win.exe
Linux系統(tǒng)下建議使用root權(quán)限安裝。下面的內(nèi)容是依據(jù)Windows7系統(tǒng)中安裝過程進(jìn)行描述的。
進(jìn)入R語(yǔ)言解釋器:R
安裝命令:install.packages("Rserve")
然后安裝程序會(huì)提示我們選擇下載鏡像,提示如下:
--- Please select a CRAN mirror for use in this session ---
等我們選擇了鏡像后(測(cè)試時(shí)選擇的是China(xxx)),安裝程序便進(jìn)行下載安裝,最終會(huì)輸出如下的信息(Linux下的輸出信息或有不同):
說明Rserve安裝成功,安裝路徑為:%R_HOME%/library/Rserve目錄。
啟動(dòng)Rserve服務(wù)
在Windows命令窗口進(jìn)入R_HOME/library/Rserve/libs/i386目錄中執(zhí)行如下命令(我的Windows7是32位的,如果是64位系統(tǒng)對(duì)應(yīng)目錄為R_HOME/library/Rserve/libs/x64)一定要在dos窗口下進(jìn)入該目錄,不然以下命令不識(shí)別:
R CMD Rserve 注意:如果允許IP遠(yuǎn)程連接要使用 R CMD Rserve --RS-enable-remote
R將作出如下應(yīng)答:
說明Rserve啟動(dòng)成功(端口6311),可以進(jìn)行連接測(cè)試了。
注意:如果執(zhí)行R CMD Rserve命令報(bào)錯(cuò),說明R不認(rèn)識(shí)此命令,需要配置R的環(huán)境變量,具體如下:
R_HOME R的安裝目錄(我的安裝目錄為: C:\Program Files\R\R-2.15.2)
path中添加
C:\Program Files\R\R-2.15.2\bin;
C:\Program Files\R\R-2.15.2\bin\x64
Java遠(yuǎn)程連接Rserve
下載依賴jar包,地址:http://www.rforge.net/Rserve/files/
共兩個(gè)jar包,下載完成后將它們加入到項(xiàng)目的classpath中即可:
? REngine.jar
? RserveEngine.jar
也可以到Rserve安裝目錄中尋找,比如:R_HOME/library/Rserve/java目錄中就有相關(guān)jar包,名字略有不同,經(jīng)測(cè)試可以使用:
簡(jiǎn)單的測(cè)試代碼:
package com.zyh.up.general.rjava;
import org.rosuda.REngine.REXPMismatchException;
import org.rosuda.REngine.Rserve.RConnection;
import org.rosuda.REngine.Rserve.RserveException;
public class RserveBegin {
public static void main(String[] args) {
try {
callRserve();
} catch (RserveException e) {
e.printStackTrace();
} catch (REXPMismatchException e) {
e.printStackTrace();
}
}
static void callRserve() throws RserveException, REXPMismatchException {
RConnection rConnection = new RConnection("192.168.101.122"); //直接寫IP如果報(bào)錯(cuò),說明沒有使用 R CMD Rserve --RS-enable-remote 的方式啟動(dòng)
String rv = rConnection.eval("R.version.string").asString();
System.out.println(rv);
double [] arr = rConnection.eval("rnorm(10)").asDoubles();
for(double d : arr) {
System.out.println(d);
}
}
}
測(cè)試可以通過,程序?qū)⑤敵鯮語(yǔ)言版本信息及10個(gè)Double類型的數(shù)字。
Java遠(yuǎn)程執(zhí)行R腳本
上面的示例只是執(zhí)行R命令,但如果我們?cè)谏戏胖肦腳本又該如何執(zhí)行該腳本或調(diào)用其中的函數(shù)呢?
有兩種方法可以完成上面的問題。
假如我們定義了一個(gè)R腳本area.R,其中定義了一個(gè)方法area,該方法接收一個(gè)半徑值然后計(jì)算對(duì)應(yīng)面積并返回,腳本內(nèi)容非常簡(jiǎn)單:
area<-function(r){pi*r^2}
下面描述一下如何調(diào)用這個(gè)腳本中的area函數(shù),并獲取其返回值。
第一種方法就是直接用source函數(shù)將area.R腳本加載上來,然后就可以像調(diào)用R語(yǔ)言內(nèi)置命令/函數(shù)一樣調(diào)用腳本中的area方法了。這樣做有一個(gè)缺點(diǎn)就是每建立一次Java與R之間的連接就需要調(diào)用source函數(shù)一次。
示例代碼:
package com.zyh.up.general.rjava;
import org.rosuda.REngine.REXP;
import org.rosuda.REngine.REXPMismatchException;
import org.rosuda.REngine.Rserve.RConnection;
import org.rosuda.REngine.Rserve.RserveException;
public class RserveBegin {
public static void main(String[] args) {
try {
callRScript();
} catch (Exception e) {
e.printStackTrace();
}
}
static void callRScript() throws RserveException, REXPMismatchException {
RConnection rc = new RConnection("192.168.101.122");//直接寫IP如果報(bào)錯(cuò),說明沒有使用 R CMD Rserve --RS-enable-remote 的方式啟動(dòng)
// source函數(shù)需要給出R腳本路徑, 注意傳入轉(zhuǎn)義的引號(hào)
rc.eval("source("/home/hadoop/wangfeng/javaR/area.R")");
REXP rexp = rc.eval("area(10)");
System.out.println("Area of 10 is " + rexp.asDouble());
}
}
代碼測(cè)試通過。