• java 与 R 相互调用


    https://www.r-project.org/

    http://cos.name/2013/08/r-rjava-java/

    http://blog.csdn.net/hwssg/article/details/39177959

    目录

    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安装

    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’
    加黑的为主要的操作步骤,要注意,我安装的时候由于软件权限不够,因此rjava包未能安装到R主目录下,同时下载包被存到了另外的位置,需要自己记住,然后将下载包复制解压到自己选择的rjava包的位置。

    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!")
    [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 FilesRR-3.0.1inx64;D: oolkitjavajdk6in;D: oolkitjavajdk6jreinserver

    JAVA_HOME: D: oolkitjavajdk6

    CLASSPATH: C:Program FilesRR-3.0.1library Javajri

    CLASSPATH=D:proSoftwareR-2.15.0library Javajri;
    PATH=D:proSoftwareR-2.15.0ini386
    R_HOME=D:proSoftwareR-2.15.0R-2.15.0

    这里要注意,如果上一步的rjava包不在默认位置,需要把上述环境变量做相应的修改。上面两种方式,第一种实测可行,第二种应该也问题不大。

    将D:proSoftwareR-2.15.0library Javajri下的三个jar包(JRIEngine.jar,JRI.jar,REngine.jar)拷到C:Program FilesJavajdk1.6.0_10lib目录下,即jdk目录的lib下

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

    D:proSoftwareR-2.15.0library Javajriexamples目录下有两个自带测试代码rtest.java和rtest2.java。

    运行这两个代码,如果结果不报错,说明调用成功。

    运行之前记得run configurations中添加VM参数设置为 -Djava.library.path=D:proSoftwareR-2.15.0library Javajri

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

    也可以使用以下代码测试

    [1] "Java-Object{Hello World!}"
    

    启动Eclipse编写程序
    rjava2

    
    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参数:在run下面,run configuration

    -Djava.library.path="C:Program FilesRR-3.0.1library
    Javajrix64"

    rjava

    运行结果:

    
    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中的使用方法。

     
  • 相关阅读:
    oracle中rownum和rowid的区别
    Delphi 流
    Delphi 关键字
    Android控件系列之ImageView
    Android控件系列(未完待续)
    Android控件系列之CheckBox
    Android控件系列之ProgressBar&在Android中利用Handler处理多线程
    Android控件系列之Button以及Android监听器
    Android控件系列之Toast
    Android控件系列之TextView
  • 原文地址:https://www.cnblogs.com/bnuvincent/p/5084124.html
Copyright © 2020-2023  润新知