用java调用R

来源:互联网 发布:win10杀毒软件知乎 编辑:程序博客网 时间:2024/06/06 09:52

为什么要用java调用R?

    Java作为一个非常流行的编程语言,具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。但是Java缺乏数据分析以及可视化的能力。但是R语言却是专门为统计而生,R语言近年来发展迅速,可以用来进行机器学习,数据挖掘,数据可视化。 为了弥补这种差距, 我们可以将JAVA与R结合起来, 

今天我们来说一下JAVA通过Rserve调用R语言。

一,环境

系统:win10

JDK:1.8

R:3.3.1

eclipse:luna

二.准备工作

在R软件里面安装Rserve包

[plain] view plain copy
  1. install.packages("Rserve")  

如果你已经安装了这个包就不需要这一步。如果安装过程没有报错就OK。接下来我们就要通过下面语句启动服务:

[plain] view plain copy
  1. Rserve()  
如果出现下面语句这表示服务已经启动好了:

[plain] view plain copy
  1. Starting Rserve...  
  2.  "D:\PROGRA~1\R\R-33~1.1\library\Rserve\libs\x64\Rserve.exe"    


现在我们已经运行Rserve服务器,我们就可以在eclipse中创建一个Java程序,使用Rserve与R进行通信,并在Java代码中调用R的函数。 

我创建里一个RserveProject的java工程,然后右击工程名—properties—Java Build Path—Librares—Add External Jar...加载REngine.jar和Rserve.jar两个jar包,我把R装在了D:\Program Files\下,所以那两个包在D:\Program Files\R\R-3.3.1\library\Rserve\java。大家根据自己的实际情况找找。


三.编写Java程序

在下面程序中,我分别直接调用了R中的函数,也调用自己的R脚本。

[plain] view plain copy
  1. import org.rosuda.REngine.Rserve.RConnection;  
  2. import org.rosuda.REngine.Rserve.RserveException;  
  3. import org.rosuda.REngine.REXPMismatchException;;  
  4. public class Temp {  
  5.   
  6.     public static void main(String[] args) throws REXPMismatchException {  
  7.         // TODO Auto-generated method stub  
  8.         RConnection connection = null;  
  9.         System.out.println("平均值");  
  10.         try {  
  11.             //创建对象  
  12.             connection = new RConnection();  
  13.             String vetor="c(1,2,3,4)";  
  14.             connection.eval("meanVal<-mean("+vetor+")");  
  15.       
  16.             //System.out.println("the mean of given vector is="+mean);  
  17.             double mean=connection.eval("meanVal").asDouble();  
  18.             System.out.println("the mean of given vector is="+mean);  
  19.             //connection.eval(arg0)  
  20.               
  21.         } catch (RserveException e) {  
  22.             // TODO Auto-generated catch block  
  23.             e.printStackTrace();  
  24.         }  
  25.         System.out.println("执行脚本");  
  26.         try {  
  27.             connection.eval("source('D:/myAdd.R')");//此处路径也可以这样写D:\\\\myAdd.R  
  28.             int num1=20;  
  29.             int num2=10;  
  30.             int sum=connection.eval("myAdd("+num1+","+num2+")").asInteger();  
  31.             System.out.println("the sum="+sum);  
  32.         } catch (RserveException e) {  
  33.             // TODO Auto-generated catch block  
  34.             e.printStackTrace();  
  35.         }  
  36.         connection.close();  
  37.     }  
  38. }  

结果为:

平均值
the mean of given vector is=2.5
执行脚本
the sum=30


其中myAdd.R代码如下:

[plain] view plain copy
  1. myAdd<-function(x,y){  
  2.     sum=x+y  
  3.     return(sum)  
  4. }  

四.Reserve的多线程

由于Rserve是以服务器的形式运行,那么它可以同时处理多个请求。 这也就意味着当我们使用命令启动Rserve的实例。

我们从R控制台启动Rserve实例,如下有三个实例。

[plain] view plain copy
  1. Rserve(port=5011)  
  2. Rserve(port=5012)  
  3. Rserve(port=5013)  
现在有了这3个独立的实例,这3个线程可以很容易地连接到这3个实例:

[plain] view plain copy
  1. //线程1连接到在端口5011上运行的实例  
  2. RConnection connection = new RConnection("hostIP_or_hostName",5011);  
  3. //线程2连接到在端口5012上运行的实例  
  4. RConnection connection = new RConnection("hostIP_or_hostName",5012);  
  5. //线程3连接到在端口5013上运行的实例  
  6. RConnection connection = new RConnection("hostIP_or_hostName",5013);  


大家如果还有什么不明白的地方可以在下面留言。


转载请声明原文链接:http://blog.csdn.net/wzgl__wh/article/details/52793558

原创粉丝点击