本篇內容介紹了“Java程序怎么通過(guò)Rserve遠程調用R”的有關(guān)知識,在實(shí)際案例的操作過(guò)程中,不少人都會(huì )遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學(xué)有所成!
Rserve介紹
Rserve是一個(gè)基于TCP/IP協(xié)議的,允許R語(yǔ)言與其他語(yǔ)言通信的C/S結構的程序,支持C/C++,Java,PHP,Python,Ruby,Nodejs等。 Rserve提供遠程連接,認證,文件傳輸等功能。我們可以設計R做為后臺服務(wù),處理統計建模,數據分析,繪圖等的任務(wù)。
詳細介紹請參照官方網(wǎng)站:https://rforge.net/Rserve/
Rserve安裝
注意:安裝Rserve前需要安裝R,我安裝的是 R-3.1.2-win.exe
Linux系統下建議使用root權限安裝。下面的內容是依據Windows7系統中安裝過(guò)程進(jìn)行描述的。
進(jìn)入R語(yǔ)言解釋器:R
安裝命令:install.packages("Rserve")
然后安裝程序會(huì )提示我們選擇下載鏡像,提示如下:
--- Please select a CRAN mirror for use in this session ---
等我們選擇了鏡像后(測試時(shí)選擇的是China(xxx)),安裝程序便進(jìn)行下載安裝,最終會(huì )輸出如下的信息(Linux下的輸出信息或有不同):
說(shuō)明Rserve安裝成功,安裝路徑為:%R_HOME%/library/Rserve目錄。
啟動(dòng)Rserve服務(wù)
在Windows命令窗口進(jìn)入R_HOME/library/Rserve/libs/i386目錄中執行如下命令(我的Windows7是32位的,如果是64位系統對應目錄為R_HOME/library/Rserve/libs/x64)一定要在dos窗口下進(jìn)入該目錄,不然以下命令不識別:
R CMD Rserve 注意:如果允許IP遠程連接要使用 R CMD Rserve --RS-enable-remote
R將作出如下應答:
說(shuō)明Rserve啟動(dòng)成功(端口6311),可以進(jìn)行連接測試了。
注意:如果執行R CMD Rserve命令報錯,說(shuō)明R不認識此命令,需要配置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遠程連接Rserve
下載依賴(lài)jar包,地址:http://www.rforge.net/Rserve/files/
共兩個(gè)jar包,下載完成后將它們加入到項目的classpath中即可:
? REngine.jar
? RserveEngine.jar
也可以到Rserve安裝目錄中尋找,比如:R_HOME/library/Rserve/java目錄中就有相關(guān)jar包,名字略有不同,經(jīng)測試可以使用:
簡(jiǎn)單的測試代碼:
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"); //直接寫(xiě)IP如果報錯,說(shuō)明沒(méi)有使用 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);
}
}
}
測試可以通過(guò),程序將輸出R語(yǔ)言版本信息及10個(gè)Double類(lèi)型的數字。
Java遠程執行R腳本
上面的示例只是執行R命令,但如果我們在上放置R腳本又該如何執行該腳本或調用其中的函數呢?
有兩種方法可以完成上面的問(wèn)題。
假如我們定義了一個(gè)R腳本area.R,其中定義了一個(gè)方法area,該方法接收一個(gè)半徑值然后計算對應面積并返回,腳本內容非常簡(jiǎn)單:
area<-function(r){pi*r^2}
下面描述一下如何調用這個(gè)腳本中的area函數,并獲取其返回值。
第一種方法就是直接用source函數將area.R腳本加載上來(lái),然后就可以像調用R語(yǔ)言?xún)戎妹?函數一樣調用腳本中的area方法了。這樣做有一個(gè)缺點(diǎn)就是每建立一次Java與R之間的連接就需要調用source函數一次。
示例代碼:
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");//直接寫(xiě)IP如果報錯,說(shuō)明沒(méi)有使用 R CMD Rserve --RS-enable-remote 的方式啟動(dòng)
// source函數需要給出R腳本路徑, 注意傳入轉義的引號
rc.eval("source("/home/hadoop/wangfeng/javaR/area.R")");
REXP rexp = rc.eval("area(10)");
System.out.println("Area of 10 is " + rexp.asDouble());
}
}
代碼測試通過(guò)。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站