JAVA如何与R完美结合起来

为什么要用java调用R?

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

今天我们来说两种方法,首先第一个,JAVA通过Rserve调用R语言。

一,环境

系统:win10

JDK:1.8

R:3.3.1

eclipse:luna

二.准备工作

在R软件里面安装Rserve包

install.packages("Rserve")

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

Rserve()

如果出现下面语句这表示服务已经启动好了:

Starting Rserve...

"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脚本。

import org.rosuda.REngine.Rserve.RConnection;

import org.rosuda.REngine.Rserve.RserveException;

import org.rosuda.REngine.REXPMismatchException;;

public class Temp {

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

// TODO Auto-generated method stub

RConnection connection = null;

System.out.println("平均值");

try {

//创建对象

connection = new RConnection();

String vetor="c(1,2,3,4)";

connection.eval("meanVal

//System.out.println("the mean of given vector is="+mean);

double mean=connection.eval("meanVal").asDouble();

System.out.println("the mean of given vector is="+mean);

//connection.eval(arg0)

} catch (RserveException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

System.out.println("执行脚本");

try {

connection.eval("source('D:/myAdd.R')");

//此处路径也可以这样写D:\\\\myAdd.R

int num1=20;

int num2=10;

int sum=connection.eval("myAdd("+num1+","+num2+")").asInteger();

System.out.println("the sum="+sum);

} catch (RserveException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

connection.close();

}

}

结果为:

平均值

the mean of given vector is=2.5

执行脚本

the sum=30

其中myAdd.R代码如下:

myAdd

sum=x+y

return(sum)

}

四.Reserve的多线程

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

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

Rserve(port=5011)

Rserve(port=5012)

Rserve(port=5013)

现在有了这3个独立的实例,这3个线程可以很容易地连接到这3个实例:

//线程1连接到在端口5011上运行的实例

RConnection connection = new RConnection("hostIP_or_hostName",5011);

//线程2连接到在端口5012上运行的实例

RConnection connection = new RConnection("hostIP_or_hostName",5012);

//线程3连接到在端口5013上运行的实例

RConnection connection = new RConnection("hostIP_or_hostName",5013);

第二种方法:

这是一种比较简单方便的方法,这次我们需要写一个简单的R语言脚本,然后通过运行这个R脚本,来打开Rserve服务。这样的话,我们每次运行Java程序之前就不用先打开R,再输入程序打开Rserve服务。这样是不是很简单方便。今天我们要用这种方法,和R语言,画一个简单的词云出来。

首先,我们建一个R脚本:

library(Rserve)

Rserve()

我将它保存成Rserve.R文件,放在了这个目录下(MyScript这是我自己新建的文件夹):    D:\Program Files\R\R-3.3.1\MyScript

提示:路径最后不要有中文字符,就是有的时候可能不识别,或包其他错误。

首先我们要导入  包,大家可以查看我的另一篇博文。我们新建一个类,用来初始化Rserve服务。代码如下

package rserve;

import javax.xml.transform.Source;

import org.rosuda.REngine.Rserve.RConnection;

import org.rosuda.REngine.Rserve.RserveException;

/**

* 启动Rserve服务

* @author henry wang

*

*/

public class Rservel {

private  static String R_EXE_PATH="D:\\Program Files\\R\\R-3.3.1\\bin\\Rscript.exe";

private static String R_SCRIPT_PATH="D:\\Program Files\\R\\R-3.3.1\\MyScript\\Rserve.R";

public static RConnection getRConnection(){

try {

RConnection rConnection=new RConnection();

return rConnection;

} catch (RserveException e) {

// TODO: handle exception

System.out.println("正在启动Rserve服务......");

try {

Runtime rn=Runtime.getRuntime();

/*

* 不建议写成直接写成rn.exec("R_EXE_PATH R_SCRIPT_PATH"),

*如果这样学的画前面定义的R_EXE_PATH,R_SCRIPT_PATH会提示

* 这两个变量没有用到

* 运行也许会出错,提示错误如下:

* java.io.IOException: Cannot run program "D:\Program": CreateProcess error=2,

*系统找不到指定的文件。

*/

String[] commandArgs={R_EXE_PATH,R_SCRIPT_PATH};

rn.exec(commandArgs);

Thread.sleep(5000);

} catch (Exception e2) {

// TODO: handle exception

e2.printStackTrace();

}

return getRConnection();

}

}

}

说明:R_EXE_PATH 是Rscript.exe或者R.exe的路径,这两个都可以。R_SCRIPT_PATH是R脚本的路径。

package rserve;

import java.awt.Graphics;

import java.awt.Image;

import java.awt.MediaTracker;

import java.awt.Toolkit;

import javax.swing.JFrame;

import org.rosuda.REngine.REXP;

import org.rosuda.REngine.Rserve.RConnection;

public class WordCloud extends JFrame{

private static final long serialVersionUID=1L;

static Image img;

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

// TODO Auto-generated method stub

WordCloud wc=new WordCloud();

REXP xp=wc.getRobj();//获得R对象

wc.PlotDemo(xp,wc);//错误

}

private REXP getRobj() throws Exception{

RConnection c=Rserve.getRConnection();

c.setStringEncoding("utf8");//设置字符编码

//返回R的版本

REXP Rservesion=c.eval("R.version.string");

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

System.out.println("\n----------绘图演示--------");

System.out.println("");

REXP xp=c.parseAndEval("jpeg('test.jpg',quality=90)");

c.eval("library(wordcloud)");

c.voidEval("colors=c('red','blue','green','yellow','purple')");

c.parseAndEval(" data(SOTU);wordcloud(SOTU,min.freq=10,colors=colors);dev.off()");

xp=c.parseAndEval("r=readBin('test.jpg','raw',3000*3000);unlink('test.jpg');r");

return xp;

}

public void PlotDemo(REXP xp, JFrame f)throws Exception{

img=Toolkit.getDefaultToolkit().createImage(xp.asBytes());

MediaTracker mediaTracker=new MediaTracker(this);

mediaTracker.addImage(img, 0);

mediaTracker.waitForID(0);

f.setTitle("Test Image");

f.setSize(img.getWidth(null),img.getHeight(null));

f.setDefaultCloseOperation(EXIT_ON_CLOSE);

f.setVisible(true);

}

public void paint(Graphics g){

g.drawImage(img, 0, 0, null);

}

}

c.parseAndEval(" data(SOTU);wordcloud(SOTU,min.freq=10,colors=colors);dev.off()");这个句子的冒号里面都是一些R语句,只不过每句话后面都有一个分号。

运行结果如下:

这样就好了,我们使用java调用R语言就绘制出了一个简单的词云。

完 谢谢观看

java cda安装_JAVA如何与R完美结合起来相关推荐

  1. java怎么安装_Java怎么安装?Java运行环境安装教程

    最近有网友说不知道怎么安装JAVA,不知道怎么安装最新版本的JAVA,今天极速小编为你做一个简单的安装教程,希望对你们有帮助.首先我们下载JAVA(下载地址:http://www.jisuxz.com ...

  2. java sdk 安装_Java SDK下载安装环境配置+AndroidKiller配置教程

    1.先要安装好适合你系统版本的JDK,在这里我使用的是JDK8,161版本: JAVA(JDK)版本:8,V161版本(Java SEDevelopment Kit 8u161),下载地址: 注意:因 ...

  3. java怎么安装_java怎么安装不了

    您好,亲爱的楼主,很高兴为您回答java的运行需要虚拟机的支持,但是对于初学者来说,与其说是虚拟机倒不如说是java运行时环境(其中就包括了虚拟机),所谓java. . 1.先将软件下载到电脑2.把手 ...

  4. java jdk安装_Java从入门到入土第一课—JDK安装及环境配置

    安装步骤如下: 下载jdk 在浏览器输入:https://www.oracle.com/technetwork/java/javase/downloads 选择想要下载的jdk版本,以Java SE ...

  5. java不能安装_java环境安装之不能安装exe文件

    经过多年,打算再学下java 从官网下载java8安装包,但因为我的计算机的cd-room被卸载掉了,安装是报错说cab文件损坏之类的错误. 从stackOverflow中找到一篇眼前一亮的解决办法. ...

  6. java程序安装_java实现可安装的exe程序

    java实现可安装的exe程序 通过编写Java代码,实现可安装的exe文件的一般思路: 1.在eclipse中创建java项目,然后编写Java代码,将编写好的Java项目导出一个.jar格式的ja ...

  7. java怎么安装_Java桌面应用程序篇:发展历史以及程序的应用

    java桌面应用印象 因为桌面程序运行在宿主机器上, 所以比如你运行java桌面程序,必然要安装java虚拟机, 也就是相当于在操作系统上再加一层抽象. 这与直接调用api的桌面程序效率相比,或多或少 ...

  8. java tm 安装_Java(TM) 6 Update(java运行环境) V 6.0.450.6 官方版

    Java(TM) 6 Update是个JAVA辅助软件,它具备高度的安全性以及跨平台的特性,能让你的电脑或手机运行java程序,用户可使用Java(TM) 6 Update来搭建甚至运行整个ava程序 ...

  9. java变量设置_java的安装与环境变量设置

    要学习java,至少需要先将java安装到系统中,而且需要配置好必要的环境变量,java才能更好的工作. 下载 要安装当然至少需要先下载,你可以直接进入如下网址直接下载最新版本的JDK版本 最新版本的 ...

最新文章

  1. 第二十八章 springboot + zipkin(brave定制-AsyncHttpClient)
  2. c# 蓝牙虚拟串口_蓝牙模块——基础知识介绍
  3. [PAT乙级]1022 D进制的A+B
  4. 前端笔记----定位
  5. RHEL/CentOS下编译安装Nginx
  6. Python基础:常用知识点汇总
  7. php 模拟请求工具,http-mock-master模拟HTTP请求库
  8. 谁是三国跳槽王:吕布成毫无规划的跳槽者
  9. 解决自己电脑VMware打开虚拟机黑屏问题
  10. VM Workstation 虚拟机安装Ghost XP教程
  11. 基于nodejs的开源博客
  12. Hibernate 拦截器 SQL语句提交前 更新表公共字段
  13. Mybatis源码分析之Mapper文件解析
  14. laravel-admin使用教程
  15. 华中农大计算机排名,华中农业大学专业排名,招生专业目录(10篇)
  16. if函数3个条件3个结果C语言,if函数3个条件嵌套公式 包括60为及格否则为不及格...
  17. 全国哀悼日,博友应该做的两件事
  18. 字体发光特效html视频,视频特效立体流光字制作
  19. 从零开始搭建腾讯云服务器
  20. 测试工程师应具备的素质

热门文章

  1. JS正则表达式数字、字母、特殊符号第一弹
  2. ssh框架整合 hibernate5.2.8_spring4.3.7_struts2.5.1
  3. BIOS 启动类型:Legacy+UEFI、UEFI BOOT、Legacy BOOT
  4. java8u221_jdk8u221下载|jdk-8u221-windows-x64 官方免费版 下载_当下软件园_软件下载
  5. python egg_python egg 简介
  6. 英雄联盟(LOL)外挂原理(仅供学术交流)
  7. 「区块链+数字身份」:身份认证的新战场,让子弹再飞会儿
  8. iOS9.0弃用AssetsLibrary中部分API
  9. 小提琴和钢琴一起学行吗_小提琴和钢琴存在一种羁绊
  10. windows11 任务栏和开始菜单都不见了怎么办?