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.
}
}