在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);	
        
	}
}

  

posted @ 2017-01-19 12:14  强迫症重症患者  阅读(561)  评论(0编辑  收藏  举报