解惑rJava R与Java的高速通道

R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大。

R语言作为统计学一门语言,一直在小众领域闪耀着光芒。直到大数据的爆发,R语言变成了一门炙手可热的数据分析的利器。随着越来越多的工程背景的人的加入,R语言的社区在迅速扩大成长。现在已不仅仅是统计领域,教育,银行,电商,互联网….都在使用R语言。

要成为有理想的极客,我们不能停留在语法上,要掌握牢固的数学,概率,统计知识,同时还要有创新精神,把R语言发挥到各个领域。让我们一起动起来吧,开始R的极客理想。

关于作者:

  • 张丹(Conan), 程序员Java,R,PHP,Javascript
  • weibo:@Conan_Z
  • blog: http://blog.fens.me
  • email: bsspirit@gmail.com

转载请注明出处:
http://blog.fens.me/r-rjava-java

前言

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

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

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

目录

  1. rJava介绍
  2. rJava安装
  3. rJava实现R调用Java
  4. rJava(JRI)实现Java调用R (win7)
  5. rJava(JRI)实现Java调用R (Ubuntu)

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

rJava安装


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

3. rJava实现R调用Java

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


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

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


  1. #同.jcall(s,"I","length")
  2. > s$length()
  3. [1] 12
  4. #同.jcall(s,"I","indexOf","World")
  5. > s$indexOf("World")
  6. [1] 6

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

在win7中安装rJava

系统环境:

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

设置环境变量


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

在R中安装rJava


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

启动Eclipse编写程序


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

在Eclipse启动设置VM参数:

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

运行结果:


  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

This entry was posted in JAVA语言实践R语言实践

解惑rJava R与Java的高速通道的更多相关文章

  1. 解惑rJava R与Java的快速通道

    阅读导读: 1.什么是RJava? 2.怎样安装RJava? 3.怎样用RJava实现R调用Java? 1. rJava介绍 rJava是一个R语言和Java语言的通信接口.通过底层JNI实现调用,同 ...

  2. R与JAVA的整合

    R是统计计算的强大工具,而JAVA是做应用系统的主流语言,两者天然具有整合的需要.关于整合,一方面,R中可以创建JAVA对象调用JAVA方法,另一方面,JAVA中可以转换R的数据类型调用R的函数,互相 ...

  3. r与java整合(转)

    http://jliblog.com/archives/10 R是统计计算的强大工具,而JAVA是做应用系统的主流语言,两者天然具有整合的需要.关于整合,一方面,R中可以创建JAVA对象调用JAVA方 ...

  4. Java NIO:通道

    最近打算把Java网络编程相关的知识深入一下(IO.NIO.Socket编程.Netty) Java NIO主要需要理解缓冲区.通道.选择器三个核心概念,作为对Java I/O的补充, 以提升大批量数 ...

  5. Java NIO Channel通道

    原文链接:http://tutorials.jenkov.com/java-nio/channels.html Java NIO Channel通道和流非常相似,主要有以下几点区别: 通道可以读也可以 ...

  6. IDC机房与阿里云vpc网络建立高速通道

    本操作以下图所示的场景为例,演示如何通过高速通道建立本地数据中心与VPC之间的私网通信. 前提条件 已提交工单获取接入点的地理位置. 步骤一: 申请物理专线并完成专线接入 登录高速通道管理控制台. 在 ...

  7. rJava包---R与Java的接口

    1.安装 版本说明:Win10+R3.2.5+JKD1.7+eclipse-jee-mars-R-win32-x86_64 install.packages("rJava") 2. ...

  8. Java NIO之通道

    一.前言 前面学习了缓冲区的相关知识点,接下来学习通道. 二.通道 2.1 层次结构图 对于通道的类层次结构如下图所示. 其中,Channel是所有类的父类,其定义了通道的基本操作.从 Channel ...

  9. 【NIO】Java NIO之通道

    一.前言 前面学习了缓冲区的相关知识点,接下来学习通道. 二.通道 2.1 层次结构图 对于通道的类层次结构如下图所示. 其中,Channel是所有类的父类,其定义了通道的基本操作.从 Channel ...

随机推荐

  1. [BUUCTF]PWN——[ZJCTF 2019]EasyHeap

    [ZJCTF 2019]EasyHeap 附件 步骤: 例行检查,64位程序 试运行一下看看程序大概执行的情况,经典的堆块的菜单 64位ida载入,首先检索字符串,发现了读出flag的函数 看一下每个 ...

  2. Go - 如何编写 ProtoBuf 插件(二)?

    目录 前言 定义插件 使用插件 获取自定义选项 小结 推荐阅读 前言 上篇文章<Go - 如何编写 ProtoBuf 插件 (一) >,分享了使用 proto3 的 自定义选项 可以实现插 ...

  3. 日历的种类(Project)

    <Project2016 企业项目管理实践>张会斌 董方好 编著   日历有三种:标准日历.24小时日历和夜班日历. 设置的位置在[项目]>[属性]>[更改工作时间]>[ ...

  4. CF74A Room Leader 题解

    Content 一场 CF 比赛有 \(n\) 个人,有 ABCDE 五道题目.在比赛过程中,参赛者还可以随时互相攻击,成功一次加 \(100\) 分,失败一次扣 \(50\)分,已知第 \(i\) ...

  5. SpringBoot整合quartz实现动态启动,停止定时任务功能

    注意:这个方法当程序重启之后会失效,所以必须将定时任务持久化到数据库,然后程序启动的时候重新把数据库的定时任务加载到quartz中 springboot程序启动初始化代码参考:https://www. ...

  6. 【LeetCode】 202. Happy Number 解题报告(Java & Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 迭代 日期 [LeetCode] 题目地址:h ...

  7. 【LeetCode】53. Maximum Subarray 最大子序和 解题报告(Python & C++ & Java)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 暴力解法 动态规划 日期 题目地址: https:/ ...

  8. 【LeetCode】268. Missing Number 解题报告(Java & Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 求和 异或 日期 题目地址:https://leet ...

  9. light oj 1100 - Again Array Queries(暴力,鸽巢原理)

    http://lightoj.com/volume_showproblem.php?problem=1100 刚一看到这题,要询问这么多次,线段树吧,想多了哈哈,根本没法用线段树做. 然后看看数据范围 ...

  10. 1170 - Counting Perfect BST

    1170 - Counting Perfect BST   PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 3 ...