解惑rJava R与Java的高速通道

大数据
Java语言在工业界长期处于霸主地位,Java语法、JVM、JDK、Java开源库,在近10年得到了爆发式的发展,几乎覆盖了应用开发的所有领域。伴随着Java的全领域发展,问题也随之而来了……

前言

Java语言在工业界长期处于霸主地位,Java语法、JVM、JDK、Java开源库,在近10年得到了爆发式的发展,几乎覆盖了应用开发的所有领域。伴随着Java的全领域发展,问题也随之而来了。语法越来越复杂,近似的项目越来越多,学好Java变得很难。对于没有IT背景的统计人员,学用Java更是难于上青天。

R一直是统计圈内处于佼佼者的语言,语法简单,学习曲线不太长也不太陡。如果能结合Java的通用性和R的专业性,碰撞出的火花,将会缤纷绚烂。

本文将介绍R与Java连接的高速通道,rJava通信方案。另外一篇文章介绍的Rserve通信方案,请参考: Rserve与Java的跨平台通信

rjava

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
  1. ~ uname -a  
  2. 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  
  3.  
  4. ~ cat /etc/issue  
  5. Ubuntu 12.04.2 LTS \n \l  
  6.  
  7. ~ R --version  
  8. R version 3.0.1 (2013-05-16) -- "Good Sport" 
  9. Copyright (C) 2013 The R Foundation for Statistical Computing  
  10. Platform: x86_64-pc-linux-gnu (64-bit)  
  11.  
  12. R is free software and comes with ABSOLUTELY NO WARRANTY.  
  13. You are welcome to redistribute it under the terms of the  
  14. GNU General Public License versions 2 or 3.  
  15. For more information about these matters see  
  16.  
  17. http://www.gnu.org/licenses/.  
  18.  
  19. ~ java -version  
  20. java version "1.6.0_29" 
  21. Java(TM) SE Runtime Environment (build 1.6.0_29-b11)  
  22. Java HotSpot(TM) 64-Bit Server VM (build 20.4-b02, mixed mode) 

rJava安装

 

  1.  
  2. #配置rJava环境  
  3. ~ sudo R CMD javareconf  
  4.  
  5. #启动R  
  6. ~ sudo R  
  7. > install.packages("rJava")  
  8. installing via 'install.libs.R' to /usr/local/lib/R/site-library/rJava  
  9. ** R  
  10. ** inst  
  11. ** preparing package for lazy loading  
  12. ** help  
  13. *** installing help indices  
  14. ** building package indices  
  15. ** testing if installed package can be loaded  
  16. * DONE (rJava)  
  17.  
  18. The downloaded source packages are in  
  19.         ‘/tmp/RtmpiZyCE7/downloaded_packages’  

 

3. rJava实现R调用Java

在R环境中,使用rJava包编程

 

  1.  
  2. #加载rJava包  
  3. > library(rJava)  
  4. > search()  
  5.  [1".GlobalEnv"        "package:rJava"     "package:stats" 
  6.  [4"package:graphics"  "package:grDevices" "package:utils" 
  7.  [7"package:datasets"  "package:methods"   "Autoloads" 
  8. [10"package:base" 
  9.  
  10. #启动JVM  
  11. > .jinit()  
  12.  
  13. #声明并赋值到字符串  
  14. > s <- .jnew("java/lang/String""Hello World!")  
  15. > s  
  16. [1"Java-Object{Hello World!}" 
  17.  
  18. #查看字符串长度  
  19. > .jcall(s,"I","length")  
  20. [112 
  21.  
  22. #索引World的位置  
  23. > .jcall(s,"I","indexOf","World")  
  24. [16 
  25.  
  26. #查看concat的方法声明  
  27. > .jmethods(s,"concat")  
  28. [1"public java.lang.String java.lang.String.concat(java.lang.String)" 
  29.  
  30. #使用concat方法连接字符串  
  31. > .jcall(s,"Ljava/lang/String;","concat",s)  
  32. [1"Hello World!Hello World!" 
  33.  
  34. #打印字符串对象  
  35. > print(s)  
  36. [1"Java-Object{Hello World!}" 
  37.  
  38. #打印字符串值  
  39. > .jstrVal(s)  
  40. [1"Hello World!" 

 

rJava优化过的方法调用,用$来调用方法

 

  1.  
  2. #同.jcall(s,"I","length")  
  3. > s$length()  
  4. [112 
  5.  
  6. #同.jcall(s,"I","indexOf","World")  
  7. > s$indexOf("World")  
  8. [16 

 

#p#

4. rJava(JRI)实现Java调用R (win7)

在win7中安装rJava

系统环境:

  • win7 64bit 旗舰版
  • R 3.0.1
  • Java 1.6.0_45

设置环境变量

 

  1.  
  2. PATH: C:\Program Files\R\R-3.0.1\bin\x64;D:\toolkit\java\jdk6\bin;;D:\toolkit\java\jdk6\jre\bin\server  
  3. JAVA_HOME: D:\toolkit\java\jdk6  
  4. CLASSPATH: C:\Program Files\R\R-3.0.1\library\rJava\jri  

 

在R中安装rJava

 

  1. > install.packages("rJava")  
  2.  
  3. #加载rJava  
  4. > library(rJava)  
  5. > .jinit()  
  6.  
  7. #R调用Java变量测试  
  8. > s <- .jnew("java/lang/String""Hello World!")  
  9. > s  
  10. [1"Java-Object{Hello World!}" 

 

启动Eclipse编写程序

rjava2

 

  1. package org.conan.r.rjava;  
  2.  
  3. import org.rosuda.JRI.Rengine;  
  4.  
  5. public class DemoRJava {  
  6.  
  7.     public static void main(String[] args) {  
  8.         DemoRJava demo = new DemoRJava();  
  9.         demo.callRJava();  
  10.     }  
  11.  
  12.     public void callRJava() {  
  13.         Rengine re = new Rengine(new String[] { "--vanilla" }, falsenull);  
  14.         if (!re.waitForR()) {  
  15.             System.out.println("Cannot load R");  
  16.             return;  
  17.         }  
  18.           
  19.         //打印变量  
  20.         String version = re.eval("R.version.string").asString();  
  21.         System.out.println(version);  
  22.  
  23.         //循环打印数组  
  24.         double[] arr = re.eval("rnorm(10)").asDoubleArray();  
  25.         for (double a : arr) {  
  26.             System.out.print(a + ",");  
  27.         }  
  28.         re.end();  
  29.     }  

 

在Eclipse启动设置VM参数:

 

  1. -Djava.library.path="C:\Program Files\R\R-3.0.1\library\rJava\jri\x64" 

 

rjava

运行结果:

 

  1. R version 3.0.1 (2013-05-16)  
  2. 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

 

  1. ~ mkdir /home/conan/R/DemoRJava  
  2. ~ cd /home/conan/R/DemoRJava  
  3. ~ ls -l  
  4. -rw-r--r-- 1 conan conan 1328 Aug  8  2013 DemoRJava.jar  

 

运行Jar包

 

  1. ~ export R_HOME=/usr/lib/R  
  2. ~ 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 

 

运行结果

 

  1. R version 3.0.1 (2013-05-16)  
  2. 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中的使用方法。

本文出自:http://blog.fens.me/r-rjava-java/

 

责任编辑:林师授 来源: 张丹的博客
相关推荐

2009-12-10 11:04:08

Java模块化OSGiJigsaw

2011-03-18 14:38:25

云数据精细化流控

2016-10-14 15:00:45

2017-07-11 16:45:51

Python整数比较

2017-09-12 15:56:43

边缘计算云计算架构

2017-12-21 10:48:40

2011-03-22 09:43:06

J-Hi

2013-04-28 11:37:29

华为GSM-R通信网络

2021-08-25 22:40:09

数据中心IT通道

2009-07-20 10:36:29

什么是JDBC

2012-03-23 14:02:11

云计算

2023-07-12 08:24:19

Java NIO通道

2010-04-15 16:00:50

无线上网问题

2017-05-18 13:45:20

2011-05-17 14:55:22

Shibboleth认证

2015-07-02 09:40:57

R语言优势缺点

2010-01-27 09:53:41

模块化可视性可用性

2018-04-20 09:06:11

R语言数据存储

2010-10-08 14:16:29

2011-06-14 12:42:49

精益扫描仪
点赞
收藏

51CTO技术栈公众号