




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、Java與R語言通信總結注1:rJava并沒有實際使用,這里提一下只是說明還存在這樣一種R與Java通信的方式,所有關于rJava的內容均來自互聯網;注2:rJava是通過JNI(Java Native Interface)實現R與Java通信,因此R與Java的執行環境需要在同一臺機器上同時存在。因為應用中需要遠程調用R腳本,因此沒有深入研究rJava。注3:RUtils是一個偶然發現的基于Rserve的連接池工具集,項目中暫時沒有使用。注4:以下內容大都經過了測試,但仍不能保證內容的權威性。R語言簡介R語言作為一門統計學語言,一直在小眾領域閃耀著光芒。直到大數據的爆發,R語言變成了一門炙手
2、可熱的數據分析的利器。隨著越來越多的工程背景的人的加入,R語言的社區在迅速擴大成長。現在已不僅僅是統計領域,教育、銀行、電商、互聯網.等等都在使用R語言。RserveRserve介紹Rserve是一個基于TCP/IP協議的,允許R語言與其他語言通信的C/S結構的程序,支持C/C+,Java,PHP,Python,Ruby,Nodejs等。 Rserve提供遠程連接,認證,文件傳輸等功能。我們可以設計R做為后臺服務,處理統計建模,數據分析,繪圖等的任務。詳細介紹請參照官方網站:Rserve安裝Linux系統下建議使用root權限安裝。下面的內容是依據Windows7系統中安裝過程進行描述的。進入
3、R語言解釋器:R安裝命令:install.packages("Rserve")然后安裝程序會提示我們選擇下載鏡像,提示如下:- Please select a CRAN mirror for use in this session -等我們選擇了鏡像后(測試時選擇的是China(xxx)),安裝程序便進行下載安裝,最終會輸出如下的信息(Linux下的輸出信息或有不同):說明Rserve安裝成功,安裝路徑為:%R_HOME%libraryRserve目錄。啟動Rserve服務在Windows命令窗口進入R_HOMElibraryRservelibsi386目錄中執行如下命令(
4、我的Windows7是32位的,如果是64位系統對應目錄為R_HOMElibraryRservelibsx64):R CMD RserveR將作出如下應答:說明Rserve啟動成功(端口6311),可以進行連接測試了。上面的啟動命令使用的本地模式,如果想遠程連接需要增加參數 RS-enable-remote即啟動命令為:R CMD Rserve -RS-enable-remote注:在Linux系統中,啟動命令是一樣的。Java遠程連接Rserve下載依賴jar包,地址:共兩個jar包,下載完成后將它們加入到項目的classpath中即可:l REngine.jarl RserveEngine
5、.jar也可以到Rserve安裝目錄中尋找,比如:R_HOME libraryRservejava目錄中就有相關jar包,名字略有不同,經測試可以使用:簡單的測試代碼: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 vo
6、id 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("22");String rv = rConnect
7、ion.eval("R.version.string").asString();System.out.println(rv);double arr = rConnection.eval("rnorm(10)").asDoubles();for(double d : arr) System.out.println(d);經測試,可以正常運行。Java遠程執行R腳本上面的示例只是執行R命令,但如果我們在服務器上放置R腳本又該如何執行該腳本或調用其中的函數呢?有兩種方法可以完成上面的問題。假如我們定義了一個R腳本area.R,其中定義了一個方法area,該方法
8、接收一個半徑值然后計算對應面積并返回,腳本內容非常簡單:area<-function(r)pi*r2下面描述一下如何調用這個腳本中的area函數,并獲取其返回值。第一種方法就是直接用source函數將area.R腳本加載上來,然后就可以像調用R語言內置命令/函數一樣調用腳本中的area方法了。這樣做有一個缺點就是每建立一次Java與R之間的連接就需要調用source函數一次。示例代碼:package com.zyh.up.general.rjava;import org.rosuda.REngine.REXP;import org.rosuda.REngine.REXPMismatchE
9、xception;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 RCon
10、nection rc = new RConnection("22");/ 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();代碼測試通過。另一種調用R腳本的方法是通過Rserv.con
11、f配置文件,該文件路徑為/etc/Rserv.conf,如果文件不存在則創建一個新的,然后在文件中添加如下的代碼:source /home/hadoop/wangfeng/javaR/area.R然后重新啟動Rserve服務即可。使用這種方式Java測試代碼需要去掉source語句這一行,即:rc.eval("source("/home/hadoop/wangfeng/javaR/area.R")");其它不變,經測試成功。注1:第二種方式只在Linux下采用,Win平臺對應的方法沒有找到。注2:有些人說配置文件為Rserve.conf,但我在122的/
12、etc下找到的是Rserv.conf,不管是哪一個文件(甚至兩者都不是,隨便命名一個),只要執行下面命令告訴Rserve配置文件是哪一個即可(需要重啟Rserve):R CMD Rserve -RS-conf Rserv.conf參考資料l l http:/blog.fens.me/r-rserve-java/l l rJavarJava介紹rJava是一個簡單的R-to-Java接口。rJava在R和Java之間提供了低層次的連接(通過JNI技術),它允許在R中創建Java對象、調用方法及訪問屬性。從某種意義上說,與rJava相反的技術是JRI(Java/R Interface),它允許從J
13、ava中調用R語言。JRI現在已經被包含到rJava中,但它仍然可以單獨使用。現在rJava被用于JGR、iPlots及JavaGD等項目中。正式由于rJava是底層接口,并使用JNI作為接口調用,所以效率非常高。在JRI的方案中,JVM直接通過內存直接加載RVM,調用過程性能幾乎無損耗,因此是非常高效連接通道,是R和Java通信的首選開發包。rJava官方網站:rJava安裝rJava安裝與Rserve類似,Linux系統也是推薦使用root用戶安裝,詳細步驟不再贅述,安裝命令:install.packages(“rJava”)提示信息與安裝Rserve時類似,安裝路徑為:%R_HOME%l
14、ibraryrJava目錄。Java使用rJava調用RJava使用rJava時需要用到JRI.jar包,該可以在%R_HOME%libraryrJavajri路徑下找到,將其加到CLASSPATH中即可。另外,有些網絡上的資料說JRI還依賴REngine.jar和JRIEngine.jar兩個jar包,經測試對于R3.0.1和R3.0.2版本僅需要JRI.jar即可。簡單的測試例子如下:import org.rosuda.JRI.Rengine;public class RJavaBegin public static void main(String args) callR();stati
15、c void callR() Rengine re = new Rengine(new String "-vanilla" , false, null);if(!re.waitForR() System.out.println("無法載入R.");return;String rVersion = re.eval("R.version.string").asString();System.out.println("Version: " + rVersion);double arr = re.eval("rn
16、orm(10)").asDoubleArray();for (double d : arr) System.out.println(d + ",");re.end();運行上面的例子時需要設置JVM啟動參數,用以指定jri.dll位置,比如:-Djava.library.path="C: RR-3.0.1libraryrJavajri”如果是64位操作系統,可能需要這樣指定(64位win7沒有通過測試):-Djava.library.path="C: RR-3.0.1libraryrJavajrix64”注:rJava沒有在Linux下進行測試
17、。參考資料l http:/blog.fens.me/r-rjava-java/l l RUtils簡介RUtils是一個用于Java連接和使用R語言的工具集,它使用Rserve并在其上添加了”池“功能,簡化了多個主機運行多個Rserve進程實例時的配置和使用;另外RUtils還對Rserve的API進行了封裝,使我們發送R腳本命令及獲取Rserve返回的計算結果等操作可以用非常簡潔的代碼來完成。依賴RUtils依賴下面幾個軟件/項目:l JDK1.6+l R語言l Rservel Apache Commons CLIl Apache Commons Configurationl Apache
18、Commons I/Ol Apache Commons Langl Apache Commons LoggingRUtils的配置文件可用的Rserve實例在RUtils中被配置到一個很簡潔的XML文件中,XML文件的根元素為RConnectionPool,每個Rserve實例體現為一個RServer節點,每個Rserver節點可以包含以下幾個屬性:l host:Rserve正在運行的主機名/IP(必需)l port:Rserve監聽的TCP端口(默認為6311)l username:建立連接時的用戶名(如果需要的話)l password:建立連接時的密碼l command:遠程主機上啟動Rs
19、erve的命令全路徑l embedded:如果設置為TRUE,RUtils將在連接池初始化時啟動Rserve,并在JVM關閉時關閉Rserve服務。這樣就不需要手動起停R服務,R服務將在我們應用的Java進程啟動之后以守護線程的方式啟動。下面是一個RUtils配置文件的簡單示例:<RConnectionPool><RConfiguration><RServer host="localhost"/><RServer host="" port="6312"/> <RS
20、erver host="" port="1234" username="me" password="pwd"/></RConfiguration></RConnectionPool>指定配置文件最好的方式是添加一個key為RConnectionPool.configuration的系統屬性,屬性值需要指定為classpath下一個合法的資源文件,如果該系統屬性沒有指定,則默認配置文件為RConnectionPool.xml。從連接池中獲取連接連接池類RCo
21、nnectionPool被設計為單例模式,因此我們不能調用其構造方法對其進行實例化,但我們可以調用該類的靜態方法getInstance()來獲取RConnectionPool類的實例。從連接池中獲取連接可以調用RConnectionPool類的borrowConnection()方法或者borrowConnection(long,java.util.concurrent.TimeUnit)方法,兩個方法在連接可用的情況下都會立即返回一個合法的RConnection實例。不帶參數的方法在沒有連接可用的情況會阻塞;另外一個方法將會等待直到給定時間參數超時,這時方法將返回null。從連接池中獲取的連
22、接在使用完畢后不需要關閉,以保證下次獲取時可以重用。如果返回了被關閉的連接將導致下次獲取連接時重新建立連接,從而會影響性能。當Java進程結束時,為了斷開所有的連接連接池應該以盡可能簡單的方式關閉。這可以通過調用RConnectionPool類的shutdown方法進行。如果程序沒有顯式的調用shutdown方法,一個JVM關閉鉤子程序將做這些操作。在Java中調用R腳本一旦你擁有了運行中的RServe服務和RConnectionPool.xml配置文件,就可以從Java中調用R了。我們當然可以通過RConnectionPool獲取RConnection連接,然后發送R腳本命令從而與Rserv
23、e交互,但這樣做在R腳本復雜的情況下會很繁瑣。更簡單的方式就是使用RScript類,如果我們使用RScript來執行R腳本的話不需要自己去獲取連接,一切都在RScript中做完了,我們需要做只有下面幾項:1. 指定一個要執行的R腳本2. 為該腳本指定輸入和輸出值3. 執行腳本及獲取R返回到Java中的輸出值下面分別來介紹一下這三步的詳細情況:1、 指定要執行的腳本RScript類提供了兩個工廠方法來指定要運行的R腳本,二者都返回一個封裝了指定R腳本的RScript對象:l RScript.createFromResource(path to resource)從CLASSPATH中加載R腳本l
24、 RScript.createFromScriptString(script string)使用字符串構建R腳本使用字符串構建R腳本示例:final String ksTest = "q <- ks.test(x,y)n" + "p_value <- q$p.valuen" + "test_statistic <- q$statistic1"final RScript rscript = RScript.createFromScriptString(ksTest);如果要使用預先定義的R腳本文件構建RScript的話
25、,只需要將腳本文件放在CLASSPATH下,RScript會自動尋找并加載。2、 為腳本綁定輸入輸出參數很多情況下我們在調用R腳本需要傳入一些參數,同時也可能需要接收R腳本運行得到的結果,RScript為我們提供了setInput方法和setOutput方法分別來綁定輸入和輸出變量;其中setInput方法有多個重載方法以支持不同的數據類型,而setOutput則使用RDataObjectType枚舉類來定義輸出變量的類型(見第4點)。在上面的示例中,x和y都是輸入參數(double數組類型),而我們要取得變量p_value和test_statistic的值也需要綁定輸出變量,所以我們需要為R
26、Script綁定輸入輸出參數,如下所示:final double xValues = new double 0.1, 0.2, 0.3, 0.4, 0.5;final double yValues = new double 0.6, 0.7, 0.8, 0.9, 1.0;/ 為腳本指定輸入變量的名字和值rscript.setInput("x", xValues);rscript.setInput("y", yValues);/ 為腳本輸出指定變量名和類型, 輸出必須在腳本執行前指定rscript.setOutput("p_value"
27、, RDataObjectType.Double);rscript.setOutput("test_statistic", RDataObjectType.Double);3、 執行腳本并獲取返回值經過上面兩步后,所剩下的也就只有執行R腳本以及獲取腳本運行的返回值了。運行腳本通過調用RScript類的execute方法進行;而針對獲取不同類型的返回值RScript則提供了一系列的getOutputXXX()方法,其中XXX代表數據類型。如下所示:rscript.execute();final double pvalue = rscript.getOutputDouble(&
28、quot;p_value");final double testStat = rscript.getOutputDouble("test_statistic");4、 RDataObjectType 枚舉RUtils使用RDataObjectType枚舉類定義了R和Java之間通信支持的數據類型(主要用在綁定輸出變量上,以獲取R腳本的計算結果),其定義的數據類型有:l RDataObjectType.String在Java和R中都代表String;獲取返回值時用rscript.getOutputString(R script variable name)
29、l RDataObjectType.StringArray在Java中代表String,在R中則是c(string vals);獲取返回值時調用rscript.getOutputStringArray(R script variable name)l RDataObjectType.Double在Java和R中都代表Double;獲取返回值時調用rscript.getOutputDouble(R script variable name)l RDataObjectType.DoubleArray在Java中代表Double,在R中則代表c(double vals);獲取數據時調用rscript.getOut
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 重慶理工職業學院《外貿英語函電》2023-2024學年第一學期期末試卷
- 平頂山學院《透視與解剖》2023-2024學年第二學期期末試卷
- 江西建設職業技術學院《元素地球化學》2023-2024學年第二學期期末試卷
- 重慶城市管理職業學院《水生生物學實驗》2023-2024學年第二學期期末試卷
- 培養孩子的自主管理能力
- 2025廚房設備專利技術合作合同
- 2025貨物商品購銷合同范本
- 2025家居用品購銷合同范本
- 小學語文統編版(2024)三年級上冊美麗的小興安嶺第二課時教案及反思
- 2025房屋租賃居間合同參考范本
- 11樓11月份工程施工月進度計劃表
- 高處作業安全監理實施細則
- 卵巢癌根治術后護理查房
- 2019年度上海市小學生健康體檢表
- 運用PDCA血透室導管感染率
- 臨床醫生教師如何上好一堂課課件
- 馬克思主義政治經濟學概論
- 布地奈德福莫特羅粉吸入劑
- 《雷雨》課件2022-2023學年人教版高中語文必修四
- 抗日游擊戰爭的戰略問題
- 2022年廣西農業農村廳事業單位筆試試題及答案
評論
0/150
提交評論