作者:实验室2012级刘力超

最近因为项目的需求,需要在Java中调用R的计算脚本,而这里介绍使用Rserve实现这一需求。

1、Rserve简介

Rserve是一个基于TCP/IP协议的,允许R语言与其他语言通信的C/S结构的程序,支持C/C++,Java,PHP,Python,Ruby,Nodejs等。 Rserve提供远程连接,认证,文件传输等功能。我们可以设计R做为后台服务,处理统计建模,数据分析,绘图等的任务。

网址:https://rforge.net/Rserve/index.html

2、Rserve的安装与加载

进入R命令行,安装Rserve:

install.packages("Rserve");

加载Rserve:

 library(Rserve);

3、启动Rserve

在windows环境下,Rserve是默认关闭远程连接调用的,因此在启动的时候需要加入允许远程调用的参数,否则将报connection refused错误

首先,将R目录下的bin文件夹加入系统环境变量PATH中。这样我们就可以在windows的CMD命令界面下使用R了。

打开windows CMD,通过cd命令进入R目录下的library\Rserve\libs\x64

键入命令:

R CMD Rserve --RS-enable-remote

CMD中将响应为:

Rserve:OK,ready to answer queries

如上,则Rserve启动成功。

4、Java中调用R

在Java中调用R需要使用Rserve的java包,分别是

  • REngine.jar
  • RserveEngine.jar

下载地址:http://www.rforge.net/Rserve/files/

下载完成后引入项目依赖中,测试代码如下:

public void TestR() throws RserveException, REXPMismatchException{
	RConnection re = new RConnection("10.202.210.146");  
        REXP x = re.eval("R.version.string");
        System.out.println(x.asString());  
        double[] arr = re.eval("rnorm(20)").asDoubles();  
        for (double a : arr) {
            System.out.print(a + ",");  
        }
        //保存为图像文件  
        File tempFile = null;  
        try {  
            re.assign("x", arr);   
            tempFile = File.createTempFile("test-", ".jpg");  
            String filePath = tempFile.getAbsolutePath();  
            re.eval("jpeg('c://test-1.jpg')");  
            re.eval("plot(x)");
            re.eval("dev.off()");  
        } catch (Exception e) {  
            e.printStackTrace();  
        } finally {  
            re.close();
        }  
}

运行后将在C盘生成test-1.jpg文件,如下图所示:

【技术教程】Java中实现R的调用-数字人文技术实验室

至此,Rserve调用成功。

参考资料:

http://f.dataguru.cn/thread-348372-1-1.html

https://rforge.net/Rserve/index.html

http://blog.csdn.net/desilting/article/details/36210157