java如何使用R语言

java目前作为非常流行的编程语言,以其独特的编程思维进行复杂的编程,但是但是Java缺乏数据分析以及可视化的能力。但是R语言却是专门为统计而生,R语言近年来发展迅速,可以用来进行机器学习,数据挖掘,数据可视化。 为了弥补这种差距, 我们可以将JAVA与R结合起来

结合方式

JAVA通过Rserve调用R语言。

一,环境

系统:win10

JDK:1.8

R:3.3.1

eclipse

二:安装R语言

关于如何安装R语言可以查看前面博客

三R中的准备工作

首先R中安装Rserve包

install.packages("Rserve")



在使用Rserve()启动服务前,需要先用

library(Rserve)加载Rserve

然后启动服务

Rserve()

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

Starting Rserve..."D:PROGRA~1RR-33~1.1libraryRservelibsx64Rserve.exe"


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

四Eclipse中使用R语言

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

代码如下

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 {
RConnection connection = null;
System.out.println("平均值");
try {
// 创建对象
connection = new RConnection();
String vetor = "c(1,2,3,4)";
connection.eval("meanVal<-mean(" + vetor +")");
double mean = connection.eval("meanVal").asDouble();
System.out.println("the mean of given vector is=" + mean);
} catch (RserveException e) {
e.printStackTrace();
}
System.out.println("执行脚本");
try {
connection.eval("source('F:/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) {
System.out.println(e);
e.printStackTrace();
}
connection.close();
}

}

其中F盘中的脚本文件如下


执行结果


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

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

Rserve(port=5011)Rserve(port=5012)Rserve(port=5013)

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

//线程1连接到在端口5011上运行的实例RConnection connection = newRConnection("hostIP_or_hostName",5011);//线程2连接到在端口5012上运行的实例RConnection connection = newRConnection("hostIP_or_hostName",5012);//线程3连接到在端口5013上运行的实例RConnection connection = newRConnection("hostIP_or_hostName",5013);

第二种方法java使用R语言

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

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

library(Rserve)Rserve()</span>

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

对于导入jar包以及R中安装wordclound和前面一样

我们新建一个类,用来初始化Rserve服务。代码如下:

package com;
import org.rosuda.REngine.Rserve.RConnection;
import org.rosuda.REngine.Rserve.RserveException;
/**
 * 启动Rserve服务
 */
public class Rservel {
private static String R_EXE_PATH = "D:/R-3.4.3/bin/R.exe";
private static String R__PATH = "D:/R-3.4.3/myStartR/Rserve.R";


public static RConnection getRConnection() {
try {
RConnection rConnection = new RConnection();
return rConnection;
} catch (RserveException e) {
System.out.println("正在启动Rserve服务......");
try {
Runtime rn = Runtime.getRuntime();
/*
* 不建议写成直接写成rn.exec("R_EXE_PATH R__PATH"),
* 如果这样学的画前面定义的R_EXE_PATH,R__PATH会提示 * 这两个变量没有用到 *
* 运行也许会出错,提示错误如下: * java.io.IOException: Cannot run program
* "D:Program": CreateProcess error=2, 系统找不到指定的文件。
*/
String[] commandArgs = { R_EXE_PATH, R__PATH };
rn.exec(commandArgs);
Thread.sleep(5000);
} catch (Exception e2) {
e2.printStackTrace();
}
return getRConnection();
}
}
}

主类如下

package com;
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 {
WordCloud wc = new WordCloud();
REXP xp = wc.getRobj();// 获得R对象
wc.PlotDemo(xp, wc);// 错误
}


private REXP getRobj() throws Exception {
RConnection c = Rservel.getRConnection();
c.setStringEncoding("utf8");// 设置字符编码
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);
}

}


结果如下



猜你喜欢

转载自blog.csdn.net/qq_34491508/article/details/80049225