Rserver实现Java与R的通信

浏览: 954

1、Rserve介绍

https://rforge.net/Rserve/ 

2、Rserve安装

install.packages("Rserve")

3、启动Rserver服务

> library(Rserve)

> Rserve()

Starting Rserve...

 "d:\PROGRA~2\R\R-32~1.5\library\Rserve\libs\x64\Rserve.exe" 

>

4、Java远程连接Rserve

下载依赖的jar包:http://www.rforge.net/Rserve/files/

REngine.jar

RserveEngine.jar

在Rserver的安装目录中R_HOME \library\Rserve\java也有这两个包名字不同但是可以用。

把这两个包加入到项目的classpath中即可

RConnection Connection = new RConnection(); //建立连接 

Connection.assgin()该方法进行赋值

Connection.eval()该方法调用R函数

5、编写Java脚本

import org.rosuda.REngine.REXP;

import org.rosuda.REngine.Rserve.RConnection;

import org.rosuda.REngine.REXPMismatchException;

import org.rosuda.REngine.REngineException;

import org.rosuda.REngine.Rserve.RserveException;

public class Test6 {

    public static void main(String[] args) throws REngineException {

        // TODO Auto-generated method stub

        try {  

            callRserve();

            } catch (RserveException e) {

                e.printStackTrace();

                } catch (REXPMismatchException e) {

                    e.printStackTrace();  

                    }

        }

    static void callRserve() throws REXPMismatchException, REngineException{

        RConnection Connection = new RConnection(); //建立连接 

       //查看R版本

        System.out.println("##########查看R版本###########");

        String rv = Connection.eval("R.version.string").asString();

        System.out.println(rv);    

        REXP x = Connection.eval("R.version.string ");

        System.out.println(x.asString());

       //执行R语句   

        System.out.println("##########执行R语句###########");

        double [] arr = Connection.eval("runif(10)").asDoubles();  

        for(double d : arr) {  

            System.out.println(d);

        }

        //调取外部R脚本

        System.out.println("##########调取外部R脚本###########");

        String fileName = "E:\\WorkTestData\\area.R";//area.R里R语句为:area<-function(r){pi*r^2}

        Connection.assign("fileName", fileName); //赋值

        Connection.eval("source(fileName)");    //sourceR脚本

            REXP rexp = Connection.eval("area(10)");  //执行R语句

           System.out.println("Area of 10 is " + rexp.asDouble());

         //使用R语言画图

           System.out.println("##########使用R语言画图###########");

           double[] xx = {1,2,3,4,5,6,7,8,9,10}; //生成两个数组 

           double[] yy = {1,4,9,16,25,36,49,64,81,100};  

           Connection.assign("x", xx); //给R的变量赋值 

           Connection.assign("y", yy);

         System.out.println("jpeg('E:/WorkTestData//test.jpg')"); 

         Connection.eval("jpeg('E:/WorkTestData/test.jpg')"); 

         Connection.eval("plot(x, y)");//绘图 

         Connection.eval("dev.off()"); 

      

    }

}

推荐 0
本文由 Seven7 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册