Rsession讓Java調用R更簡單__Rsession

來源:互聯網
上載者:User

如果你在項目中使用maven進行管理,那可以在pom.xml 中添加如下內容:

   <dependency>       <groupId>com.github.yannrichet</groupId>       <artifactId>Rsession</artifactId>       <version>1.8.3</version>   </dependency>

寫了好幾篇關於Rserve的文章了,Rserve作為R語言的通訊介面,已經成為了R語言擴充的重要通道。大資料時代的到來,讓原本小眾的R語言,不經意間擠進了開發語言前20名。

同時,具有多種程式設計語言背景的IT工程師們,開始進入R的社區,協助R語言快速進化。Rserve提供了一個通訊的介面,通過封裝可以讓R引擎嵌入到其他語言裡。

目錄 Rsession介紹 Rsession下載 用Eclipse構建Rsession項目 Rsession的API介紹 Rserve伺服器系統內容 Rsession使用 1. Rsession介紹

Rsession提供了一種簡單的方式,讓Java可以訪問遠程或本地的Rserve執行個體。Rsession是對Rserve的封裝,提供了更高層的API介面,包括Rserve伺服器控制,多會話機制,並支援Windows環境。

另一個R和Java通訊的庫JRI,並不支援多會話機制。關於R和Java通訊的其他文章,請參考:解惑rJava R與Java的Express Connect, Rserve與Java的跨平台通訊

Rsession項目首頁:https://code.google.com/p/rsession/ 2. Rsession下載

系統內容 Win7 64bit R: 3.0.1 x86_64-w64-mingw32/x64 b4bit

發行包下載:解壓縮就可以直接使用了

http://rsession.googlecode.com/files/libRsession.zip

包括3個jar包:REngine.jar, Rserve.jar, Rsession.jar

原始碼下載:(SVN)

http://rsession.googlecode.com/svn/trunk/Rsession/

~ cd d:\workspace\java~ svn checkout http://rsession.googlecode.com/svn/trunk/ rsession-read-only~ mv rsession-read-only rsession~ cd rsession\Rsession

項目是通過Ant構建的,我們可以自己編譯,打包。

~ antBuildfile: d:\workspace\java\rsession\Rsession\build.xmlclean:clean-dist:init:    [mkdir] Created dir: d:\workspace\java\rsession\Rsession\build    [mkdir] Created dir: d:\workspace\java\rsession\Rsession\dist\libresource:     [copy] Copying 28 files to d:\workspace\java\rsession\Rsession\dist\lib     [copy] Copied 12 empty directories to 1 empty directory under d:\workspace\java\rsession\Rsession\dist\libcompile:    [javac] d:\workspace\java\rsession\Rsession\build.xml:33: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds    [javac] Compiling 10 source files to d:\workspace\java\rsession\Rsession\builddist:      [jar] Building jar: d:\workspace\java\rsession\Rsession\dist\lib\Rsession.jar      [zip] Building zip: d:\workspace\java\rsession\Rsession\dist\libRsession.zipBUILD SUCCESSFULTotal time: 2 seconds

在目錄:d:\workspace\java\rsession\Rsession\dist\下面,產生發行包,libRsession.zip 3. 用Eclipse構建Rsession項目

用Eclipse構建Rsession項目,複製Rsession\dist\目錄檔案到項目,並載入到項目的環境變數。

4. Rsession的API介紹

查看類庫:Rsession.jar

介面類 BusyListener: Notify the state of R engine EvalListener: Notify the evaluation of R expression Logger: Support R messages printing UpdateObjectsListener: Notify the changing of R environment objects

功能類 Rdaemon: RServe的守護進程 RLogPanel: 顯示R日誌的空間 RObjectsPanel: 顯示R變數的控制項 RserverConf: 串連Rserve執行個體的設定檔 Rsession: 串連Rserve執行個體 StartRserve: 啟動本地的Rserve 5. Rserve伺服器系統內容

伺服器系統內容 Linux: Ubuntu 12.04.2 LTS 64bit R: 3.0.1 x86_64-pc-linux-gnu Rserve: Rserve v1.7-1

Rserve環境 IP: 192.168.1.201,允許遠端存取 連接埠: 6311 登陸認證: 使用者名稱:conan, 密碼:conan 字元編碼: utf-8

Rserve伺服器環境與文章中 Rserve的R語言用戶端RSclient 配置相同。 6. Rsession使用

建立遠端連線

RserverConf rconf = new RserverConf("192.168.1.201", 6311, "conan", "conan", new Properties());Rsession s = Rsession.newInstanceTry(System.out, rconf);

執行R指令碼

double[] rand = s.eval("rnorm(5)").asDoubles();for(double ran:rand){    System.out.print(ran+",");}//日誌輸出[eval] rnorm(5)  org.rosuda.REngine.REXPDouble@5f934ad[5]{0.08779203903807914,0.039929482749452114,-0.8788534039223883,-0.8875740206608903,-0.8493446334021442}0.08779203903807914,0.039929482749452114,-0.8788534039223883,-0.8875740206608903,-0.8493446334021442

R建立對象並儲存環境

// 建立一個R對象s.set("demo", Math.random());s.eval("ls()");// 儲存R環境到本地到檔案s.save(new File("./output/save.Rdata"), "demo");// 刪除R對象demos.rm("demo");s.eval("ls()");// 從檔案載入R環境s.load(new File("./output/save.Rdata"));s.eval("ls()");s.eval("print(demo)");//日誌輸出[set] demo 

建立一個data.frame對象

s.set("df", new double[][] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 }, { 10, 11, 12 } }, "x1", "x2", "x3");double df$x1_3 = s.eval("df$x1[3]").asDouble();System.out.println(df$x1_3);s.rm("df");//日誌輸出[set] df 

在本地產生一個圖形檔案

s.toJPEG(new File("./output/plot.png"), 400, 400, "plot(rnorm(10))");//日誌輸出[set] plotfile_1100539400 

以HTML格式輸出

String html = s.asHTML("summary(rnorm(100))");System.out.println(html);//日誌輸出<html>     Min.   1st Qu.    Median      Mean   3rd Qu.      Max. <br/>-2.332000 -0.659900  0.036920  0.004485  0.665800  2.517000 </html>

以文字格式設定輸出

String txt = s.asString("summary(rnorm(100))"); // format in textSystem.out.println(txt);//日誌輸出    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. -3.19700 -0.65330 -0.09893 -0.07190  0.53300  2.29000 

安裝新類庫

System.out.println(s.installPackage("sensitivity", true));//日誌輸出  trying to load package sensitivity  package sensitivity is not installed.  package sensitivity not yet installed.[eval] install.packages('sensitivity',repos='http://cran.cict.fr/',dependencies=TRUE)  org.rosuda.REngine.REXPNull@4d47c5fc  request package sensitivity install...  package sensitivity is not installed.!   package sensitivity installation failed.Impossible to install package sensitivity !

查看完整的檔案:RsessionDemo.java

~ vi RsessionDemo.javapackage org.conan.r.rsession;import java.io.File;import java.util.Properties;import org.math.R.RserverConf;import org.math.R.Rsession;import org.rosuda.REngine.REXPMismatchException;public class RsessionDemo {    public static void main(String args[]) throws REXPMismatchException {        RserverConf rconf = new RserverConf("192.168.1.201", 6311, "conan", "conan", new Properties());        Rsession s = Rsession.newInstanceTry(System.out, rconf);        // 執行R指令碼        double[] rand = s.eval("rnorm(5)").asDoubles();        System.out.println(rand);        // 建立一個R對象        s.set("demo", Math.random());        s.eval("ls()");        // 儲存R運行時狀態到檔案        s.save(new File("./output/save.Rdata"), "demo");        // 刪除R對象demo        s.rm("demo");        s.eval("ls()");        // 從檔案載入R環境        s.load(new File("./output/save.Rdata"));        s.eval("ls()");        s.eval("print(demo)");        // 建立一個data.frame對象        s.set("df", new double[][] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 }, { 10, 11, 12 } }, "x1", "x2", "x3");        double df$x1_3 = s.eval("df$x1[3]").asDouble();        System.out.println(df$x1_3);        s.rm("df");        // 產生一個圖形檔案        s.eval("getwd()");        s.toJPEG(new File("./output/plot.png"), 400, 400, "plot(rnorm(10))");        // 以HTML格式輸出        String html = s.asHTML("summary(rnorm(100))");         System.out.println(html);        // 以文字格式設定輸出        String txt = s.asString("summary(rnorm(100))");        System.out.println(txt);        // 安裝新類庫        System.out.println(s.installPackage("sensitivity", true));        s.end();    }}

對比Rserve的JavaAPI(參考文章:Rserve與Java的跨平台通訊),是不是感覺Rsession再友好呢。

我們在使用RStudio時,工作管理員中也可以看到rsession的進程。猜一下,RStudio也在使用rsession做程式介面。

動起手來,創造就在自己手中。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.