解惑rJava R與Java的高速通道
前言
Java語(yǔ)言在工業(yè)界長(zhǎng)期處于霸主地位,Java語(yǔ)法、JVM、JDK、Java開源庫(kù),在近10年得到了爆發(fā)式的發(fā)展,幾乎覆蓋了應(yīng)用開發(fā)的所有領(lǐng)域。伴隨著Java的全領(lǐng)域發(fā)展,問題也隨之而來了。語(yǔ)法越來越復(fù)雜,近似的項(xiàng)目越來越多,學(xué)好Java變得很難。對(duì)于沒有IT背景的統(tǒng)計(jì)人員,學(xué)用Java更是難于上青天。
R一直是統(tǒng)計(jì)圈內(nèi)處于佼佼者的語(yǔ)言,語(yǔ)法簡(jiǎn)單,學(xué)習(xí)曲線不太長(zhǎng)也不太陡。如果能結(jié)合Java的通用性和R的專業(yè)性,碰撞出的火花,將會(huì)繽紛絢爛。
本文將介紹R與Java連接的高速通道,rJava通信方案。另外一篇文章介紹的Rserve通信方案,請(qǐng)參考: Rserve與Java的跨平臺(tái)通信
1. rJava介紹
rJava是一個(gè)R語(yǔ)言和Java語(yǔ)言的通信接口,通過底層JNI實(shí)現(xiàn)調(diào)用,允許在R中直接調(diào)用Java的對(duì)象和方法。
rJava還提供了Java調(diào)用R的功能,是通過JRI(Java/R Interface)實(shí)現(xiàn)的。JRI現(xiàn)在已經(jīng)被嵌入到rJava的包中,我們也可以單獨(dú)試用這個(gè)功能?,F(xiàn)在rJava包,已經(jīng)成為很多基于Java開發(fā)R包的基礎(chǔ)功能組件。
正式由于rJava是底層接口,并使用JNI作為接口調(diào)用,所以效率非常高。在JRI的方案中,JVM直接通過內(nèi)存直接加載RVM,調(diào)用過程性能幾乎無(wú)損耗,因此是非常高效連接通道,是R和Java通信的***開發(fā)包。
2. rJava安裝
系統(tǒng)環(huán)境:
- 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環(huán)境
- ~ sudo R CMD javareconf
- #啟動(dòng)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實(shí)現(xiàn)R調(diào)用Java
在R環(huán)境中,使用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"
- #啟動(dòng)JVM
- > .jinit()
- #聲明并賦值到字符串
- > s <- .jnew("java/lang/String", "Hello World!")
- > s
- [1] "Java-Object{Hello World!}"
- #查看字符串長(zhǎng)度
- > .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!"
- #打印字符串對(duì)象
- > print(s)
- [1] "Java-Object{Hello World!}"
- #打印字符串值
- > .jstrVal(s)
- [1] "Hello World!"
rJava優(yōu)化過的方法調(diào)用,用$來調(diào)用方法
- #同.jcall(s,"I","length")
- > s$length()
- [1] 12
- #同.jcall(s,"I","indexOf","World")
- > s$indexOf("World")
- [1] 6
#p#
4. rJava(JRI)實(shí)現(xiàn)Java調(diào)用R (win7)
在win7中安裝rJava
系統(tǒng)環(huán)境:
- win7 64bit 旗艦版
- R 3.0.1
- Java 1.6.0_45
設(shè)置環(huán)境變量
- 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調(diào)用Java變量測(cè)試
- > s <- .jnew("java/lang/String", "Hello World!")
- > s
- [1] "Java-Object{Hello World!}"
啟動(dòng)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);
- //循環(huán)打印數(shù)組
- double[] arr = re.eval("rnorm(10)").asDoubleArray();
- for (double a : arr) {
- System.out.print(a + ",");
- }
- re.end();
- }
- }
在Eclipse啟動(dòng)設(shè)置VM參數(shù):
- -Djava.library.path="C:\Program Files\R\R-3.0.1\library\rJava\jri\x64"
運(yùn)行結(jié)果:
- 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環(huán)境,繼續(xù)測(cè)試。
5. rJava(JRI)實(shí)現(xiàn)Java調(diào)用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
運(yùn)行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
運(yùn)行結(jié)果
- 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的互調(diào)。包括了R通過rJava調(diào)用Java,Java通過JRI調(diào)用R。并演示了win和linux中的使用方法。
本文出自:http://blog.fens.me/r-rjava-java/