java 调用R语言

java 调用R语言

采用rsession 来实现, 

环境:windows7 , 安装R 

maven 项目的pom:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.example</groupId>
	<artifactId>test-r</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>test-r</name>
	<description>Demo project for Spring Boot</description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.4.3.RELEASE</version>
		<relativePath /> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
		</dependency>
		<dependency>
			<groupId>commons-io</groupId>
			<artifactId>commons-io</artifactId>
			<version>2.4</version>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>com.github.yannrichet</groupId>
			<artifactId>JMathArray</artifactId>
			<version>1.0</version>
		</dependency>

		<dependency>
			<groupId>com.github.yannrichet</groupId>
			<artifactId>Rsession</artifactId>
			<version>1.8.3</version>
		</dependency>

		<dependency>
			<groupId>org.rosuda.REngine</groupId>
			<artifactId>REngine</artifactId>
			<version>2.1.0</version>
		</dependency>
		<dependency>
			<groupId>org.rosuda.REngine</groupId>
			<artifactId>Rserve</artifactId>
			<version>1.8.1</version>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>


</project>


单元测试类:

package com.example;

import static org.math.R.Rsession.cast;

import java.io.IOException;
import java.io.PrintStream;
import java.net.Inet4Address;
import java.net.UnknownHostException;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.math.R.Logger;
import org.math.R.RserverConf;
import org.math.R.Rsession;
import org.rosuda.REngine.REXP;
import org.rosuda.REngine.REXPMismatchException;
import org.rosuda.REngine.RList;

public class UnitTest {
	PrintStream p = System.err;
	Rsession s;
	int rand = Math.round((float) Math.random() * 10000);

	public static void main(String[] args) {
		org.junit.runner.JUnitCore.main(UnitTest.class.getName());
	}
	
	@Test
	public void exeRscript(){
		//1.设置working directory 
		String workingDir = System.getProperty("user.dir");
		String wd=workingDir+"\\examples";
		System.out.println(wd);
		
		//转换为windows 识别的斜杠
		wd = wd.replaceAll("\\\\", "/");
		
		//原先考虑设置woringdirectory 之后直接source *.R 发现无效, 后采用文件的完整路径
		//s.voidEval("setwd("+wd+")");
		
		//2.执行命令source脚本,( 文件要加入单引号)
		s.voidEval("source('"+wd+"/branin.R')");
		
		//3.得到结果
	}
	
	@Test
	public void getRoot(){
		 String workingDir = System.getProperty("user.dir");
		   System.out.println("Current working directory : " + workingDir);
	}

	// require(quantmod) #引用quantmod包
	// getSymbols("GOOG",src="yahoo",from="2013-01-01", to='2013-04-24')
	// #从雅虎财经获取google的股票数据
	// chartSeries(GOOG,up.col='red',dn.col='green') #显示K线图
	// addMACD() #增加MACD图
	/**
	 * show k line demo
	 */
	@Test
	public void kLine() {
		System.out.println("kLine##############################");
		/**
		 * 需要导入的packages
		 */
		s.installPackage("quantmod", true);
		/**
		 * append R script
		 */
		s.voidEval("getSymbols(\"GOOG\",src=\"yahoo\",from=\"2013-01-01\", to='2013-04-24')");
		s.voidEval("chartSeries(GOOG,up.col='red',dn.col='green')");
		s.voidEval("addMACD()");
		s.voidEval("addRSI()");
	}

	/**
	 * test how to run r script Test is OK
	 */
	@Test
	public void testCalc() {
		System.out.println("testCalc#############################");
		s.installPackage("DiceKriging", true);

		s.voidEval("branin <- function(x) {" + "x1 <- x[1]*15-5   " + "x2 <- x[2]*15  "
				+ "(x2 - 5/(4*pi^2)*(x1^2) + 5/pi*x1 - 6)^2 + 10*(1 - 1/(8*pi))*cos(x1) + 10" + "}");

		s.voidEval("cat('z = ',branin(c( 0.456 , 0.789 )),'\n');");
	}

	@Test
	public void testCast() throws REXPMismatchException {
		System.out.println("testClass########################");
		assert ((String[]) cast(s.eval("c('abcd','sdfds')"))).length == 2;
		assert ((double[]) cast(s.eval("array(array(0.0,c(4,3)))"))).length == 12;

		String[] str = (String[]) cast(s.eval("c('abcd','sdfds')"));
		for (String s : str) {
			System.out.println(s);
		}

		Boolean b = (Boolean) cast(s.eval("TRUE"));
		System.out.println(b);

		// Rlist
		RList rlist = (RList) cast(s.eval("data.frame(aa=rnorm(10), bb = rnorm(10))"));

		for (String key : rlist.keys()) {
			System.out.println(key + "::::" + rlist.get(key));
			REXP exp = rlist.at(key);
			double[] ds = exp.asDoubles();
			for (int i = 0; i < ds.length; i++) {
				System.out.println(ds[i]);
			}
		}

	}

	@Before
	public void init() {
		Logger l = new Logger() {
			@Override
			public void println(String message, Level l) {
				System.out.println(">>>>>" + l + ">#<" + message);
			}

			@Override
			public void close() {
			}
		};

		RserverConf conf = RserverConf.parse("R://localhost");
		s = Rsession.newInstanceTry(l, conf);
		System.err.println("是否成功的链接到R:" + s.connected);
		try {
			boolean isReachable = Inet4Address.getByName("10.1.51.96").isReachable(1000);
			System.out.println("是否可以Reach本地ip:"+isReachable);
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		try {
			System.err.println(s.silentlyEval("R.version.string").asString());
		} catch (REXPMismatchException ex) {
			ex.printStackTrace();
		}
		try {
			System.err.println(
					"Rserve version " + s.silentlyEval("installed.packages()[\"Rserve\",\"Version\"]").asString());
		} catch (REXPMismatchException ex) {
			ex.printStackTrace();
		}

	}

	@After
	public void tearDown() {
		try {
			// uncomment following for sequential call.
			Thread.sleep(1000);
		} catch (InterruptedException ex) {
			ex.printStackTrace();
		}
		s.end();
		// A shutdown hook kills all Rserve at the end.
	}

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值