R的Java接口

2018-09-03

2018-09-03
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安装


  按照普通的软件包按照方式可以将rJava安装到本地。

## install.packages("rJava")   # 安装rJava软件包

3 rJava实现R调用Java


library(rJava)  # 加载rJava包
search()        # 为R对象提供搜索路径
##  [1] ".GlobalEnv"        "package:rJava"     "package:stats"    
##  [4] "package:graphics"  "package:grDevices" "package:utils"    
##  [7] "package:datasets"  "package:methods"   "Autoloads"        
## [10] "package:base"
.jinit()  # 启动JVM

s <- .jnew("java/lang/String", "Hello World!")  # 声明并赋值到字符串
s
## [1] "Java-Object{Hello World!}"
.jcall(s,"I","length")   # 查看字符串长度
## [1] 12
.jcall(s,"I","indexOf","World")   # 索引World的位置
## [1] 6
.jmethods(s,"concat")   # 查看concat的方法声明
## [1] "public java.lang.String java.lang.String.concat(java.lang.String)"
.jcall(s,"Ljava/lang/String;","concat",s)   #使用concat方法连接字符串
## [1] "Hello World!Hello World!"
print(s)      # 打印字符串对象
## [1] "Java-Object{Hello World!}"
.jstrVal(s)   # 打印字符串值
## [1] "Hello World!"

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

s$length()   # 同.jcall(s,"I","length")
## [1] 12
s$indexOf("World")   # 同.jcall(s,"I","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 
CLASSPATH=D:\proSoftware\R-2.15.0\library\rJava\jri;
PATH=D:\proSoftware\R-2.15.0\bin\i386
R_HOME=D:\proSoftware\R-2.15.0\R-2.15.0\

  这里要注意,如果上一步的rjava包不在默认位置,需要把上述环境变量做相应的修改。

  将D:\proSoftware\R-2.15.0\library\rJava\jri下的三个jar包(JRIEngine.jar,JRI.jar,REngine.jar)拷到C:\Program Files\Java\jdk1.6.0_10\lib目录下,即jdk目录的lib下

  打开eclipse,创建java project。同时将上述三个包导入工程中。

  D:\proSoftware\R-2.15.0\library\rJava\jri\examples目录下有两个自带测试代码rtest.java和rtest2.java。运行这两个代码,如果结果不报错,说明调用成功。

  运行之前记得run configurations中添加VM参数设置为 -Djava.library.path=D:\proSoftware\R-2.15.0\library\rJava\jri

  另外,导入包之后,全部设置完之后如果程序报错,可以重启eclipse,重新尝试。

5 参考文献


[1] java与r互相调用. http://www.mamicode.com/info-detail-1163971.html
[2] java调用r. https://blog.csdn.net/hwssg/article/details/39177959
[3] 解惑 rJava R 与 Java 的高速通道. 张丹. https://cosx.org/2013/08/r-rjava-java .2013-08-14

返回: R 语言, R的接口