Rserve 是一个基于 TCP/IP 的服务器程序,它允许其他语言调用 R 语言。由于 Rserve 采用 C/S (客户端/服务器)的调用方式,因此客户端并不需要链接 R 语言库,客户端程序与 R 程序可以实现低耦合的目的。
为调用 R 语言,需要实现一个与 Rserve 通信的客户端程序,幸运的是目前常用的语言包括 C/C++,PHP,Java 等都实现提供与 Rserve 通信的客户端程序。
本文讲述 Java 语言如何利用 Rserve 实现与 R 语言的通信。
安装 Rserve
假设 R 的运行环境是 CentOS(CentOS 使用yum install R
来安装 R),在 CentOS 我们已经安装好 R。
在 Linux 命令行中输入
R
进入 R 的交互环境,然后输入
> install.packages("Rserve")
接下来就可以安装 Rserve。
启动 Rserve
启动 Rserve 有两种方式,一种是在 R 程序中启动,另一种是在命令行中启动。
1. R 程序启动 Rserve
打开 R 的交互环境,输入以下命令:
library(Rserve)
Rserve()
执行后,Rserve 便启动起来。
2. 命令行启动 Rserve
也可以直接在命令行中输入:
R CMD Rserve
启动 Rserve。
为让 Rserve 支持远程连接,可以加入--RS-enable-remote
参数:
R CMD Rserve --RS-enable-remote
Java 调用 R
使用 IntelliJ IDEA 创建一个 Maven quickstart 项目,然后在 pom.xml 中添加 Java 版本的 Rserve 客户端的依赖:
<!-- https://mvnrepository.com/artifact/org.rosuda.REngine/Rserve -->
<dependency>
<groupId>org.rosuda.REngine</groupId>
<artifactId>Rserve</artifactId>
<version>1.8.1</version>
</dependency>
然后编写调用 R 的代码。
import org.rosuda.REngine.REXP;
import org.rosuda.REngine.Rserve.RConnection;
import org.rosuda.REngine.Rserve.RserveException;
import org.rosuda.REngine.REXPMismatchException;
public class RserveDemo
{
public static void main ( String[] args ) throws RserveException, REXPMismatchException
{
RserveDemo rserveDemo = new RserveDemo();
rserveDemo.callRserve();
}
private void callRserve() throws RserveException, REXPMismatchException {
// 连接 Rserve
RConnection c = new RConnection("120.78.80.23");
// 输入 R 的版本
REXP x = c.eval("R.version.string");
System.out.println(x.asString());
// 获取10个随机数字
double[] arr = c.eval("rnorm(10)").asDoubles();
for (double a : arr) {
System.out.print(a + ",");
}
System.out.println();
// 调用 R 源文件
c.eval("source('/home/R/add.R')");
int sum = c.eval("myAdd(1, 2)").asInteger();
System.out.println(sum);
}
}
在上述代码中,我们首先创建了与 Rserve 的连接。由于 Java 代码与 Rserve 不在同一台机器,所以我们指定了 Rserve 的机器 IP 地址。
接下来,我们调用了 R 语言的一些方法,包括输入 R 语言的版本,获取10个随机数字。
最后,我们演示了如何调用 R 语言源代码。在 Linux 平台我们先创建一个 add.R 的文件,然后编写 R 代码:
myAdd <- function(x, y) {
sum <- x + y
return (sum)
}
add.R 源代码放置在目录 /home/R 下。R 语言中使用source('/home/R/add.R')
可以执行源代码,在 Java 代码中,我们先执行 add.R 源代码,接下来调用了myAdd()
函数。
执行以上代码,输出:
R version 3.5.0 (2018-04-23)
-2.533623370009491,0.7961512738732901,0.7122860585280386,-0.16063583146722446,-0.598315148752494,0.09854836382399271,-1.0914493041810422,-1.5425930835313806,0.584390936738569,0.35687345246533786,
3
参考资料
- http://www.rforge.net/Rserve/index.html
- http://www.rforge.net/Rserve/doc.html
- http://www.rforge.net/Rserve/example.html
- http://blog.fens.me/r-rserve-java/
- http://blog.fens.me/r-rserve-server/
- https://blog.csdn.net/wzgl__wh/article/details/52793558
- https://blog.csdn.net/u011955252/article/details/64904906