解惑rJava R與Java的高速通道

閱讀導讀:
1.什麼是RJava?
2.如何安裝RJava?
3.如何用RJava實現R調用Java?





1. rJava介紹
rJava是一個R語言和Java語言的通信接口,通過底層JNI實現調用,允許在R中直接調用Java的對象和方法。

rJava還提供了Java調用R的功能,是通過JRI(Java/R Interface)實現的。JRI現在已經被嵌入到rJava的包中,我們也可以單獨試用這個功能。現在rJava包,已經成爲很多基於Java開發R包的基礎功能組件。

正式由於rJava是底層接口,並使用JNI作爲接口調用,所以效率非常高。在JRI的方案中,JVM直接通過內存直接加載RVM,調用過程性能幾乎無損耗,因此是非常高效連接通道,是R和Java通信的首選開發包。

2. rJava安裝

系統環境:
  • Linux Ubuntu 12.04.2 LTS 64bit server
  • R version 3.0.1 64bit
  • Java (Oracle SUN) 1.6.0_29 64bit Server VM
~ uname -a
Linux conan 3.5.0-23-generic #35~precise1-Ubuntu SMP Fri Jan 25 17:13:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

~ cat /etc/issue
Ubuntu 12.04.2 LTS \n \l

~ R --version
R version 3.0.1 (2013-05-16) -- "Good Sport"
Copyright (C) 2013 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under the terms of the
GNU General Public License versions 2 or 3.
For more information about these matters see

http://www.gnu.org/licenses/.

~ java -version
java version "1.6.0_29"
Java(TM) SE Runtime Environment (build 1.6.0_29-b11)
Java HotSpot(TM) 64-Bit Server VM (build 20.4-b02, mixed mode)
rJava安裝
#配置rJava環境
~ sudo R CMD javareconf

#啓動R
~ sudo R
> install.packages("rJava")
installing via 'install.libs.R' to /usr/local/lib/R/site-library/rJava
** R
** inst
** preparing package for lazy loading
** help
*** installing help indices
** building package indices
** testing if installed package can be loaded
* DONE (rJava)

The downloaded source packages are in
        ‘/tmp/RtmpiZyCE7/downloaded_packages’
3. rJava實現R調用Java
在R環境中,使用rJava包編程
#加載rJava包
> library(rJava)
> search()
[1] ".GlobalEnv"        "package:rJava"     "package:stats"
[4] "package:graphics"  "package:grDevices" "package:utils"
[7] "package:datasets"  "package:methods"   "Autoloads"
[10] "package:base"

#啓動JVM
> .jinit()

#聲明並賦值到字符串
> s <- .jnew("java/lang/String", "Hello World!")
> s
[1] "Java-Object{Hello World!}"

#查看字符串長度
> .jcall(s,"I","length")
[1] 12

#索引World的位置
> .jcall(s,"I","indexOf","World")
[1] 6

#查看concat的方法聲明
> .jmethods(s,"concat")
[1] "public java.lang.String java.lang.String.concat(java.lang.String)"

#使用concat方法連接字符串
> .jcall(s,"Ljava/lang/String;","concat",s)
[1] "Hello World!Hello World!"

#打印字符串對象
> print(s)
[1] "Java-Object{Hello World!}"

#打印字符串值
> .jstrVal(s)
[1] "Hello World!"
rJava優化過的方法調用,用$來調用方法
#同.jcall(s,"I","length")
> s$length()
[1] 12

#同.jcall(s,"I","indexOf","World")
> s$indexOf("World")
[1] 6
4. rJava(JRI)實現Java調用R (win7)
在win7中安裝rJava
系統環境:
  • win7 64bit 旗艦版
  • R 3.0.1
  • Java 1.6.0_45
設置環境變量
PATH: C:\Program Files\R\R-3.0.1\bin\x64;D:\toolkit\java\jdk6\bin;;D:\toolkit\java\jdk6\jre\bin\server
JAVA_HOME: D:\toolkit\java\jdk6
CLASSPATH: C:\Program Files\R\R-3.0.1\library\rJava\jri
在R中安裝rJava
> install.packages("rJava")

#加載rJava
> library(rJava)
> .jinit()

#R調用Java變量測試
> s <- .jnew("java/lang/String", "Hello World!")
> s
[1] "Java-Object{Hello World!}"
啓動Eclipse編寫程

package org.conan.r.rjava;

import org.rosuda.JRI.Rengine;

public class DemoRJava {

    public static void main(String[] args) {
        DemoRJava demo = new DemoRJava();
        demo.callRJava();
    }

    public void callRJava() {
        Rengine re = new Rengine(new String[] { "--vanilla" }, false, null);
        if (!re.waitForR()) {
            System.out.println("Cannot load R");
            return;
        }
        
        //打印變量
        String version = re.eval("R.version.string").asString();
        System.out.println(version);

        //循環打印數組
        double[] arr = re.eval("rnorm(10)").asDoubleArray();
        for (double a : arr) {
            System.out.print(a + ",");
        }
        re.end();
    }
}
在Eclipse啓動設置VM參數:
-Djava.library.path="C:\Program Files\R\R-3.0.1\library\rJava\jri\x64"

運行結果:
R version 3.0.1 (2013-05-16)
0.04051018703700011,-0.3321596519938258,0.45642459001166913,-1.1907153494936031,1.5872266854172385,1.3639721994863943,-0.6309712627586983,-1.5226698569087498,-1.0416402147174952,0.4864034017637044,
打包DemoRJava.jar
在Eclipse中完成打包,上傳到linux環境,繼續測試。
5. rJava(JRI)實現Java調用R (Ubuntu)
新建目錄DemoRJava,上傳DemoRJava.jar到DemoRJava
~ mkdir /home/conan/R/DemoRJava
~ cd /home/conan/R/DemoRJava
~ ls -l
-rw-r--r-- 1 conan conan 1328 Aug  8  2013 DemoRJava.jar
運行Jar包
~ export R_HOME=/usr/lib/R
~ java -Djava.library.path=/usr/local/lib/R/site-library/rJava/jri -cp /usr/local/lib/R/site-library/rJava/jri/JRI.jar:/home/conan/R/DemoRJava/DemoRJava.jar org.conan.r.rjava.DemoRJava
運行結果
R version 3.0.1 (2013-05-16)
0.6374494596732511,1.3413824702002808,0.04573045670001342,-0.6885617932810327,0.14970067632722675,-0.3989493870007832,-0.6148250252955993,0.40132038323714453,-0.5385260423222166,0.3459850956295771,
我們完成了,R和Java的互調。包括了R通過rJava調用Java,Java通過JRI調用R。並演示了win和linux中的使用方法。








發佈了114 篇原創文章 · 獲贊 30 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章