R语言- 实验报告 - 利用R语言脚本与Java相互调用
一、 实训内容
- 利用R语言对Java项目程序进行调用,本实验包括利用R语言对java的.java文件进行编译和执行输出。
- 在Java中调用R语言程序。本实验通过eclipse编写Java程序的方式,调用R语言的脚本文件进行传值运算,并将执行后的结果返回给Java程序。
二、 实验课题目标
- 要求能在R x64 3.6.1程序中进行简单的工作空间切换功能,以及掌握基本的shell.exec()和system()函数的应用。
- 掌握在R语言中进行包的下载和加载的方法,以及启动Rserve服务的方法。
- 掌握R语言与Java相互调用的基本原理和实现方法。
三、 实验平台
1、 系统: Windows 10
Intel(R) Core(TM)i7-7500U CPU @ 2.70GHz 2.90 GHz
RAM 8.00GB
2、工具:
R x64 3.6.1
notepad.exe
eclipse
word 2016
四、 实施步骤
(1)、R语言调用Java项目程序
1、 切换R语言的工作空间。
首先在C:\目录下,新建文件夹为workspace,再打开R x64 3.6.1程序,输入命令:getwd() ,获取当前R语言程序的工作空间。输入如命令:setwd("C:/workspace") ,将workspace作为R语言的工作目录,再加以验证是否切换成功。
图4-1 切换工作空间
2、 编写Java程序。
在R x64 3.6.1程序中,输入命令:shell.exec("notepad") ,打开记事本,编写相应的Java类文件,并保存到C:\ workspace目录下,命名为demo.java。
图4-2 R语言打开notepad

图4-3 Java代码示例
3、 使用R语言编译Java源文件。
首先,这里以demo.java文件,虽然只有一个.java格式的文件,但是也可以将其理解为一个简单的Java项目。在R x64 3.6.1程序中,输入命令:system("javac demo.java") ,编译C:\ workspace目录下的demo.java文件。
图4-4 编译Java文件成功
当在返回的结果中看到[1] 0 ,则表示已经成功进行了编译。如图4-5所示,在C:\ workspace目录下,已经成功生成了demo.class字节文件,也再次验证了编译过程中没有错误。
图4-5 编译结果生成文件
4、 使用R语言运行已经编译的demo.class文件。在R x64 3.6.1程序中,输入命令:system("java demo") ,执行刚编译好的demo.class字节文件。
图4-6 执行成功
很明显,在返回的结果中显示:“利用R语言成功调用Java程序! [1] 0”的字样,这表示R语言成功调用了经过编译的Java项目程序。这里虽然是以简单的单个.java文件做实验,但即使Java项目文件再多,此方法都可以使用。
(2)、Java中调用让语言程序
1、安装Rserve包。在R x64 3.6.1程序中,输入命令:install.packages("Rserve") ,下载‘Rserve’程序包。在弹出的mirrors选项中,选择上海的服务器即可。
图4-7 Rserve下载成功
2、加载Rserve包。输入命令:library(Rserve) ,加载Rserve程序包。
3、启动服务。输入命令:Rserve() ,开始启动Rserve服务。
图4-8 Rserve服务开启成功
4、编写调用R语言的Java程序。打开eclipse,新建项目为demo。同时,在demo项目工程名称上右击,选择“Build Path”-“Configure Build Path..”。在Libraries
选项卡中,单击Add External JARs.. ,加载2、3步骤中下载的REngine.jar和Rserve.jar文件
图4-9成功加载Rserve包
5、 编写demo类文件。具体示例代码如下:
package demo;
import org.rosuda.REngine.Rserve.RConnection;
import org.rosuda.REngine.Rserve.RserveException;
import org.rosuda.REngine.REXPMismatchException;;
public class demo {
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('c:/ workspace/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();
}
}
6、 在c:\workspace目录下新建myAdd.r脚本,脚本内容如图所示:
图4-10 myAdd.r脚本
7、 在eclipse中运行该工程的主类文件,运行结果如图4-11所示:
图4-11 执行成功
明显,在返回的结果中,有以下信息:“the mean of given vector is=2.5
执行脚本 the sum=30 ”,这正是Java程序调用R语言执行后,返回的结果。
五、 实验成果
(1)、R语言调用Java项目程序
在实验步骤中,利用R对编译的demo.class字节文件进行执行时,成功返回如图5-1所示的内容,即“利用R语言成功调用Java程序! [1] 0”,表明利用R语言成功运行了Java项目程序。同时,隐含性地表明R语言可以调用Java语言,对.java文件进行编译和执行。
图5-1 R语言成功调用Java
(2)、Java中调用R语言程序
当在eclipse中运行调用R脚本的主类时,在执行反馈信息中,返回了:“the mean of given vector is=2.5 执行脚本 the sum=30 ”。这计算结果,需通过R语言进行,也就是说Java也成功调用了R语言,即调用R语言脚本进行运算。如图5-2所示:
图5-2 Java调用R语言程序成功
六、 实训总结
本实验的经验收获和总结,可分点总结如下:
- 在利用Java调用R语言脚本时,需要加载REngine.jar和Rserve.jar两个jar包。而这两个jar包来源于,在中R x64 3.6.1使用install.packages("Rserve") 的方式进行下载Rserve。
- 在服务端计算机安装R之后可以直接使用install.packages(“Rserve”)进行安装。需要使用时在R控制台下加载该包,然后输入命令Rserve(),开启服务器就可以供客户端调用。
- 在实现R语言调用java的过程中,也可以使用rjava包,其是一个R语言和Java语言的通信接口,通过底层JNI实现调用,允许R直接调用java对象的方法。而本实验,利用简单的函数system()来实现在R语言直接调用Java程序。
- 在R语言调用java的时候,也可以进行传值类型的调用。即:Main函数参数String[] args,它是一个字符串数组,用来接收从命令行输入的参数。
参数之间用空格隔开,java解释器会自动处理,把用空格隔开的每一个参数通过args数组传递给main方法。参数下标从0开始,args[0]就代表1第一个参数。当然输入参数之间可以有多个空格,中间的多个空格会被忽略掉。
R语言- 实验报告 - 利用R语言脚本与Java相互调用的更多相关文章
- c语言实验报告
实验项目:分支结构实验 姓名:熊承启 4.3.1if语句的应用 问题描述: 读入三个分别表示箱子长宽高的整数值,判断并输出该箱子是长方体还是正方体. 程序框图: 程序实现: #include< ...
- C语言实验报告二
实验一:第11次实验作业报告 题目:方阵循环右移 实验要求:将给定n×n方阵中的每个元素循环向右移m个位置,即将第0.1.⋯.n−1列变换为第n−m.n−m+1.⋯.n−1.0.1.⋯.n−m−1列. ...
- 第二次C语言实验报告
#一.设计题目,设计思路,实现方法 ##设计题目 15-10 找最长的字符串,14-5 指定位置输出字符串,13-6 数组循环右移,12-5 查找指定字符,11-5 打印杨辉三角. ##设计思路 15 ...
- 第一次C语言实验报告
一.实验题目,设计思路,实现方法 实验四4-2-9三个数由小到大输出,要求比较三数大小并按顺序输出.运用穷举法列举所有可能性再对应输出.运用多分支结构. 实验四4-2-4 三天打鱼两天晒网,运用循环结 ...
- c语言实验报告(四) 从键盘输入字符串a和字符串b,并在a串中的最小元素(不含结束符)后面插入字符串b.
a串中最小元素后的字符被舍弃了. #include<stdio.h>#include<string.h>void main(){ int i,min=0; char a[2 ...
- C语言实验报告(五) 用自定义函数求2~n之间的素数
#include<stdio.h>#include <math.h>int main(){ int i,n; printf("input n:"); ...
- C语言实验报告(五) 两个正整数的最大公约数
编程实现求两个正整数的最大公约数,要求计算最大公约数用函数fun(int a,int b)实现. #include<stdio.h>void main(){ int n,a,b; in ...
- C语言实验报告(四)完全数
完全数,又称完美数或者完备数.是一些特殊的自然数.它所有的真因子的和,恰好等于它本身.编程找出1000以内的所有完全数,并输出该数成为完全数的因子. (例如6=1+2+3.按照6,its factor ...
- 20155225 实验一《Java开发环境的熟悉》实验报告
20155225 实验一<Java开发环境的熟悉>实验报告 一.命令行下Java程序的开发 按照老师提供的步骤,运行程序如下: 二.IDEA下Java程序开发.调试 设置条件断点如下: 三 ...
随机推荐
- Matplotlib绘图及动画总结
目录 Matplotlib绘图总结 绘图原理 block模式(python默认) interactive模式(ipython模式默认) 深入子图 子图表示 子图绘图 绘制动画 参考链接 Matplot ...
- 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 4
18.4 创建PDO对象 使用PDO在与不同数据库管理系统之间交互时,PDO对象中的成员的方法是统一各种数据库的访问接口,所以在使用PDO与数据库交互之前,首先要创建一个PDO对象.在通过构造方法创 ...
- PHP 源码学习 | 变量类型数据结构
前段时间因为项目需要,研究了一下在 Windows 系统下进行 PHP 扩展的开发,对于 PHP 扩展的开发并不是一件容易的事情(话又说回来了,会者不难,难者不会,关键是自己不会).我当时的需求,主要 ...
- [08]ASP.NET Core 中 launchsettings.json 启动配置文件
ASP.NET Core launchsettings.json 启动配置文件 本文作者:梁桐铭- 微软最有价值专家(Microsoft MVP) 文章会随着版本进行更新,关注我获取最新版本 本文出自 ...
- 在 ASP.NET Core 中使用 ApplicationPart 的简单示例
1. 项目截图: 2. 代码 <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFra ...
- 黄聪:PHP转换网址相对路径到绝对路径的一种方法
相信很多程序(尤其是采集类的程序)都会有需要把网址的相对路径转换成绝对路径的需要,例如采集到某页面的HTML代码中包含资源文件经常会看到这样的文件名: <link rel="style ...
- 面试官:你看过Redis数据结构底层实现吗?
面试中,redis也是很受面试官亲睐的一部分.我向在这里讲的是redis的底层数据结构,而不是你理解的五大数据结构.你有没有想过redis底层是怎样的数据结构呢,他们和我们java中的HashMap. ...
- Python爬取《冰雪奇缘2》豆瓣影评
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 刘铨@CCIS Lab PS:如有需要Python学习资料的小伙伴可 ...
- 在RPA中使用Python批量生成指定尺寸的缩略图!比Ps好用!
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 htt ...
- Java性能之优化RPC网络通信
服务框架的核心 大型服务框架的核心:RPC通信 微服务的核心是远程通信和服务治理 远程通信提供了服务之间通信的桥梁,服务治理提供了服务的后勤保障 服务的拆分增加了通信的成本,因此远程通信很容易成为系统 ...