java 调用R语言

来源:互联网 发布:格式化成json字符串 编辑:程序博客网 时间:2024/05/16 14:48

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());}@Testpublic 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.得到结果}@Testpublic 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 */@Testpublic 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 */@Testpublic 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');");}@Testpublic 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);// RlistRList 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]);}}}@Beforepublic void init() {Logger l = new Logger() {@Overridepublic void println(String message, Level l) {System.out.println(">>>>>" + l + ">#<" + message);}@Overridepublic 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();}}@Afterpublic 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
原创粉丝点击