在java中实现java与R的交互的几种方法
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); } }