京公网安备 11010802034615号
经营许可证编号:京B2-20210330
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<-mean("+vetor+")");
//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<-function(x,y){
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()</span>
我将它保存成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语言就绘制出了一个简单的词云。
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
B+树作为数据库索引的核心数据结构,其高效的查询、插入、删除性能,离不开节点间指针的合理设计。在日常学习和数据库开发中,很 ...
2026-01-30在数据库开发中,UUID(通用唯一识别码)是生成唯一主键、唯一标识的常用方式,其标准格式包含4个短横线(如550e8400-e29b-41d4- ...
2026-01-30商业数据分析的价值落地,离不开标准化、系统化的总体流程作为支撑;而CDA(Certified Data Analyst)数据分析师,作为经过系统 ...
2026-01-30在数据分析、质量控制、科研实验等场景中,数据波动性(离散程度)的精准衡量是判断数据可靠性、稳定性的核心环节。标准差(Stan ...
2026-01-29在数据分析、质量检测、科研实验等领域,判断数据间是否存在本质差异是核心需求,而t检验、F检验是实现这一目标的经典统计方法。 ...
2026-01-29统计制图(数据可视化)是数据分析的核心呈现载体,它将抽象的数据转化为直观的图表、图形,让数据规律、业务差异与潜在问题一目 ...
2026-01-29箱线图(Box Plot)作为数据分布可视化的核心工具,能清晰呈现数据的中位数、四分位数、异常值等关键统计特征,广泛应用于数据分 ...
2026-01-28在回归分析、机器学习建模等数据分析场景中,多重共线性是高频数据问题——当多个自变量间存在较强的线性关联时,会导致模型系数 ...
2026-01-28数据分析的价值落地,离不开科学方法的支撑。六种核心分析方法——描述性分析、诊断性分析、预测性分析、规范性分析、对比分析、 ...
2026-01-28在机器学习与数据分析领域,特征是连接数据与模型的核心载体,而特征重要性分析则是挖掘数据价值、优化模型性能、赋能业务决策的 ...
2026-01-27关联分析是数据挖掘领域中挖掘数据间潜在关联关系的经典方法,广泛应用于零售购物篮分析、电商推荐、用户行为路径挖掘等场景。而 ...
2026-01-27数据分析的基础范式,是支撑数据工作从“零散操作”走向“标准化落地”的核心方法论框架,它定义了数据分析的核心逻辑、流程与目 ...
2026-01-27在数据分析、后端开发、业务运维等工作中,SQL语句是操作数据库的核心工具。面对复杂的表结构、多表关联逻辑及灵活的查询需求, ...
2026-01-26支持向量机(SVM)作为机器学习中经典的分类算法,凭借其在小样本、高维数据场景下的优异泛化能力,被广泛应用于图像识别、文本 ...
2026-01-26在数字化浪潮下,数据分析已成为企业决策的核心支撑,而CDA数据分析师作为标准化、专业化的数据人才代表,正逐步成为连接数据资 ...
2026-01-26数据分析的核心价值在于用数据驱动决策,而指标作为数据的“载体”,其选取的合理性直接决定分析结果的有效性。选对指标能精准定 ...
2026-01-23在MySQL查询编写中,我们习惯按“SELECT → FROM → WHERE → ORDER BY”的语法顺序组织语句,直觉上认为代码顺序即执行顺序。但 ...
2026-01-23数字化转型已从企业“可选项”升级为“必答题”,其核心本质是通过数据驱动业务重构、流程优化与模式创新,实现从传统运营向智能 ...
2026-01-23CDA持证人已遍布在世界范围各行各业,包括世界500强企业、顶尖科技独角兽、大型金融机构、国企事业单位、国家行政机关等等,“CDA数据分析师”人才队伍遵守着CDA职业道德准则,发挥着专业技能,已成为支撑科技发展的核心力量。 ...
2026-01-22在数字化时代,企业积累的海量数据如同散落的珍珠,而数据模型就是串联这些珍珠的线——它并非简单的数据集合,而是对现实业务场 ...
2026-01-22