package com.ecloud.bigdata.Rserve.Demo;
import org.rosuda.REngine.REXP;
import org.rosuda.REngine.REXPDouble;
import org.rosuda.REngine.REXPInteger;
import org.rosuda.REngine.REXPList;
import org.rosuda.REngine.REXPMismatchException;
import org.rosuda.REngine.REngineException;
import org.rosuda.REngine.RList;
import org.rosuda.REngine.Rserve.RConnection;
import org.rosuda.REngine.Rserve.RserveException;
/**
*
* @author pc
* 在java中实现java与R的交互的几种方法
*/
public class Demo6 {
public static void main(String[] args) throws REXPMismatchException,
REngineException {
// 创建本地连接
RConnection connection = new RConnection("192.168.37.21");
// 1、通过source(function.R)实现java与R的交互
System.out.println("========1、通过source(function.R)实现java与R的交互========");
connection.eval("source('/root/lulu/workspace/R/Rserve/Demo6.R')");
int num1 = 12;
int num2 = 23;
int sum = connection.eval("myadd(" + num1 + "," + num2 + ")")
.asInteger();//通过“+ 变量 +”来传入参数
System.out.println("The Sum is -> " + sum);
System.out.println("================================");
// 2、通过定义数组实现java与R的交互
System.out.println("=======2、通过定义数组实现java与R的交互=======");
double[] xx = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; // 生成两个数组
double[] yy = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
connection.assign("x", xx); // 给R的变量赋值
connection.assign("y", yy);
System.out.println("jpeg(\"/root/lulu/workspace/R/Rserve/Demo6.jpg\")");
connection.eval("jpeg(\"/root/lulu/workspace/R/Rserve/Demo6.jpg\")");
connection.eval("qqplot(x, y)");// 绘图
connection.eval("dev.off()");
//3、使用“.assign”、“.eval”和“capture.output()”实现java与R的交互:在java中定义R变量
System.out.println("=======3、使用“.assign”、“.eval”和“capture.output()”实现java与R的交互====");
double R_NA = REXPDouble.NA;
double x[] = { 1.0, 0.5, R_NA, Double.NaN, 3.5 };
connection.assign("x", x);
String nas = connection.eval(
"paste(capture.output(print(x)),collapse='\\n')").asString();
System.out.println(nas);
//4、使用“.eval”、“capture.output()”和“asString()”实现java与R的交互:在java中打印R中的值
System.out.println("=====4、使用“.eval”和“asString()”实现java与R的交互=======");
REXP x4 = connection.eval("R.version.string");
System.out.println(x4.asString());
System.out.println("================");
connection.eval("x5 = 5");
String x5 = connection.eval(
"paste(capture.output(print(x5)),collapse='\\n')").asString();
System.out.println(x5);
//5、使用RList实现java与R的交互
System.out.println("=====5、使用RList实现java与R的交互====");
RList rlist = new RList();
rlist.put("a",new REXPInteger(new int[] { 0,1,2,3}));
rlist.put("b",new REXPDouble(new double[] { 0.5,1.2,2.3,3.0}));
System.out.println(" assign x=pairlist");
connection.assign("x", new REXPList(rlist));
REXP xa5 = connection.parseAndEval("x");
System.out.println(" x = "+xa5);
String test = connection.eval(
"paste(capture.output(print(head(x))),collapse='\\n')").asString();
System.out.println(test);
}
}