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 客户端的依赖:

org.rosuda.REngine

Rserve

1.8.1

然后编写调用 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

sum

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

参考资料

java的rserve实现_Java 使用 Rserve 实现与 R 的通信相关推荐

  1. java socket nio 阻塞_Java NIO实现非阻塞式socket通信

    博主知识水平有限,只能提供一个个人的狭隘的理解,如果有新人读到这儿,建议看一下其他教程或者API,如果不明白,再来看一下:如果有dalao读到这儿,希望能指出理解中的问题~谢谢 Java提供了用于网络 ...

  2. java防止批量攻击_java 防止 XSS 攻击的常用方法总结

    在前面的一篇文章中,讲到了java web应用程序防止 csrf 攻击的方法,参考这里java网页程序采用 spring 防止 csrf 攻击.,但这只是攻击的一种方式,还有其他方式,比如今天要记录的 ...

  3. java 反编译项目_Java 7 –反编译项目硬币

    java 反编译项目 大家好,该是从2012年开始写作的时候了.正如您在其他博客中可能已经看到的那样,有一些更改可以使您使用Java编程时的开发人员生活变得更加轻松:Diamond运算符,Switch ...

  4. 关于java的外语文献_java英文参考文献

    近年来,随着我国科学的技术的飞速发展,计算机语言的内容和形式得到了极大的丰富,特别是java语言的广泛应用,它不仅是计算机语言的重要组成部分,同时也是我国程序编写的重要内容之一,java语言的出现和广 ...

  5. 菜鸟学习笔记:Java提升篇10(网络2——UDP编程、TCPSocket通信、聊天室案例)

    菜鸟学习笔记:Java提升篇10(网络2--UDP编程.TCPSocket通信) UDP编程 TCP编程(Socket通信) 单个客户端的连接 多个客户端的连接(聊天室案例) UDP编程 在上一篇中讲 ...

  6. 使用知乎开源图片加载框架出现java.lang.NoClassDefFoundError: Failed resolution of: Lcom/zhihu/matisse/R$plurals

    因为项目中出现了知乎的开源框架MatisseActivity,其实就是一个图片选择器,但是有一个问题就是:我点击了9张图片,并设置最多只能选择9张,但是选择第十张时,图片就崩溃了,并且报了以下错误 j ...

  7. Android java.lang.NoClassDefFoundError: Failed resolution of: Lcom/zhihu/matisse/R$plurals(使用知乎开源相册)

    因为项目中出现了知乎的开源框架MatisseActivity,其实就是一个图片选择器,但是有一个问题就是:我点击了9张图片,并设置最多只能选择9张,但是选择第十张时,图片就崩溃了,并且报了以下错误 j ...

  8. java变量的定义_Java变量_Java变量概念定义

    Java变量_Java变量概念定义 Java变量定义 java变量包含静态变量(static Variable).成员变量()和局部(local Variable )变量三种.其实,也可以说两种,静态 ...

  9. java发送简单邮件_Java程序实现发送简单文本邮件

    /** * Java程序实现发送简单文本邮件 * * @author Administrator * */ public class SendTextMail { // 定义发件人地址 public  ...

最新文章

  1. Djiango模板语言DTL
  2. 传粉飞行器是拯救传粉昆虫危机的利器还是毁灭者
  3. C++ 内存泄露处理方法 (转)
  4. Sword STL之map效率问题
  5. Spring/SpingMVC常见问题总结
  6. sql server 2008 年累计数_MySQL高阶问题:server层和存储引擎层是如何交互的?
  7. 崩溃!新浪程序员加班错失 77 万年会大奖
  8. mysql安装失败net_mysql安装后.net程序运行出错的解决方法
  9. char* 赋值 const char* 释放_Effective C++读书笔记之条款3:尽可能使用const
  10. 【Vue案例二】实现对表单数据的添加、删除以及关键字查询操作
  11. 在本地新建分支,以进行功能开发
  12. 触发日期spring3整合quartz实现任务调度功能
  13. mysql 写不进数据库_求助,为何我的数据不能写入数据库
  14. TCP实现原理(拥塞控制)
  15. SpringBoot自动装配原理解析
  16. python爬虫——彼岸图网
  17. pkg打包node项目
  18. WatchGuard 防火墙封 Msn qq icq
  19. 将一个大文件分割为若干个小文件的方法
  20. 图的深度遍历(邓俊辉版)

热门文章

  1. 现代制造工程——第七章(轧制和锻造)
  2. 现代制造工程课堂笔记03:第二部分(含易考点与必考点)
  3. php 取url根域名,php中取得URL的根域名的代码
  4. 数字信号处理笔记1-信号与常见操作
  5. python软件安装和使用方法_aws cli的安装及使用(内含python的安装方法)
  6. 频域/s域/z域三大变换的性质对比
  7. js reduce实现中间件_js数组高阶方法reduce经典用法代码分享
  8. esper(4-3)-Non-Overlapping Context
  9. C#设计模式--模板方法模式(学习Learning hard 设计模式笔记)
  10. spring security原理