rJava包---R与Java的接口

来源:互联网 时间:2016-07-11

1.安装

版本说明:Win10+R3.2.5+JKD1.7+eclipse-jee-mars-R-win32-x86_64

install.packages("rJava")

2.R中调用Java

载入rJava包,运行library(rJava),注意:在一个会话中,包只需载入一次。如果需要,你可以自定义启动环境以自动载入会频繁使用的那些包,下面是测试程序:

> library(rJava)

> .jinit() #打开JVM

> s <- .jnew("java/lang/String","Hello World!") #新建一个字符串

> s #参看s变量

[1] "Java-Object{Hello World!}"

说明:

.jinit()的作用是:初始化JVM,.jinit()在运行rJava任何方法之前必须启动。

.jnew 创建新的Java对象。

## Not run:

f <- .jnew("java/awt/Frame","Hello")

.jcall(f,,"setVisible",TRUE)

上面的程序是创建了一个Frame窗口,设置的窗口可见并且可最大化和最小化,但是不可关闭,显示如下:

.jcall calls a Java method with the supplied arguments.用来设置方法提供的参数;

.jcall("java/lang/System","S","getProperty","os.name")

if (!nzchar(Sys.getenv("NOAWT"))) {

f <- .jnew("java/awt/Frame","Hello")

.jcall(f,,"setVisible",TRUE)

}

3.Java中调用R

3.1设置环境变量

一定要建环境变量,不然运行eclipse时会报错,环境变量(根据自己的安装情况):

JAVA_HOME D:\ImprtantSoft\Java\jdk1.7

classpath %JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar;%R_HOME%\library\rJava\jri

path %R_HOME%\bin\x64;D:\ImprtantSoft\MySQL\MySQL Server 5.6\bin;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;%JAVA_HOME%\jre\bin\server

R_HOME D:\ImprtantSoft\R\R-3.2.5

l  将D:\ImprtantSoft\R\R-3.2.5\library\rJava\jri下的三个jar包(JRIEngine.jar,JRI.jar,REngine.jar)拷到D:\ImprtantSoft\Java\jdk1.7\lib目录下,即jdk目录的lib下

l  打开eclipse,创建java project。同时将上述三个包导入工程中。

l  D:\ImprtantSoft\R\R-3.2.5\library\rJava\jri\examples目录下有两个自带测试代码rtest.java和rtest2.java。

l  运行这两个代码,如果结果不报错,说明调用成功。

3.2eclipse中创建项目

rtest类:

package testR;

import java.awt.FileDialog;

import java.awt.Frame;

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.util.Enumeration;

import org.rosuda.JRI.REXP;

import org.rosuda.JRI.RList;

import org.rosuda.JRI.RMainLoopCallbacks;

import org.rosuda.JRI.RVector;

import org.rosuda.JRI.Rengine;

class TextConsole implements RMainLoopCallbacks

{

public void rWriteConsole(Rengine re, String text, int oType) {

System.out.print(text);

}

public void rBusy(Rengine re, int which) {

System.out.println("rBusy("+which+")");

}

public String rReadConsole(Rengine re, String prompt, int addToHistory) {

System.out.print(prompt);

try {

BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

String s=br.readLine();

return (s==null||s.length()==0)?s:s+"\n";

} catch (Exception e) {

System.out.println("jriReadConsole exception: "+e.getMessage());

}

return null;

}

public void rShowMessage(Rengine re, String message) {

System.out.println("rShowMessage \""+message+"\"");

}

public String rChooseFile(Rengine re, int newFile) {

FileDialog fd = new FileDialog(new Frame(), (newFile==0)?"Select a file":"Select a new file", (newFile==0)?FileDialog.LOAD:FileDialog.SAVE);

fd.show();

String res=null;

if (fd.getDirectory()!=null) res=fd.getDirectory();

if (fd.getFile()!=null) res=(res==null)?fd.getFile():(res+fd.getFile());

return res;

}

public void rFlushConsole (Rengine re) {

}

public void rLoadHistory (Rengine re, String filename) {

}

public void rSaveHistory (Rengine re, String filename) {

}

}

public class rtest {

public static void main(String[] args) {

// just making sure we have the right version of everything

if (!Rengine.versionCheck()) {

System.err.println("** Version mismatch - Java files don't match library version.");

System.exit(1);

}

System.out.println("Creating Rengine (with arguments)");

// 1) we pass the arguments from the command line

// 2) we won't use the main loop at first, we'll start it later

// (that's the "false" as second argument)

// 3) the callbacks are implemented by the TextConsole class above

Rengine re=new Rengine(args, false, new TextConsole());

System.out.println("Rengine created, waiting for R");

// the engine creates R is a new thread, so we should wait until it's ready

if (!re.waitForR()) {

System.out.println("Cannot load R");

return;

}

/* High-level API - do not use RNI methods unless there is no other way

to accomplish what you want */

try {

REXP x;

re.eval("data(iris)",false);

System.out.println(x=re.eval("iris"));

// generic vectors are RVector to accomodate names

RVector v = x.asVector();

if (v.getNames()!=null) {

System.out.println("has names:");

for (Enumeration e = v.getNames().elements() ; e.hasMoreElements() ;) {

System.out.println(e.nextElement());

}

}

// for compatibility with Rserve we allow casting of vectors to lists

RList vl = x.asList();

String[] k = vl.keys();

if (k!=null) {

System.out.println("and once again from the list:");

int i=0; while (i<k.length) System.out.println(k[i++]);

}

// get boolean array

System.out.println(x=re.eval("iris[[1]]>mean(iris[[1]])"));

// R knows about TRUE/FALSE/NA, so we cannot use boolean[] this way

// instead, we use int[] which is more convenient (and what R uses internally anyway)

int[] bi = x.asIntArray();

{

int i = 0; while (i<bi.length) { System.out.print(bi[i]==0?"F ":(bi[i]==1?"T ":"NA ")); i++; }

System.out.println("");

}

// push a boolean array

boolean by[] = { true, false, false };

re.assign("bool", by);

System.out.println(x=re.eval("bool"));

// asBool returns the first element of the array as RBool

// (mostly useful for boolean arrays of the length 1). is should return true

System.out.println("isTRUE? "+x.asBool().isTRUE());

// now for a real dotted-pair list:

System.out.println(x=re.eval("pairlist(a=1,b='foo',c=1:5)"));

RList l = x.asList();

if (l!=null) {

int i=0;

String [] a = l.keys();

System.out.println("Keys:");

while (i<a.length) System.out.println(a[i++]);

System.out.println("Contents:");

i=0;

while (i<a.length) System.out.println(l.at(i++));

}

System.out.println(re.eval("sqrt(36)"));

} catch (Exception e) {

System.out.println("EX:"+e);

e.printStackTrace();

}

// Part 2 - low-level API - for illustration purposes only!

//System.exit(0);

// simple assignment like a<-"hello" (env=0 means use R_GlobalEnv)

long xp1 = re.rniPutString("hello");

re.rniAssign("a", xp1, 0);

// Example: how to create a named list or data.frame

double da[] = {1.2, 2.3, 4.5};

double db[] = {1.4, 2.6, 4.2};

long xp3 = re.rniPutDoubleArray(da);

long xp4 = re.rniPutDoubleArray(db);

// now build a list (generic vector is how that's called in R)

long la[] = {xp3, xp4};

long xp5 = re.rniPutVector(la);

// now let's add names

String sa[] = {"a","b"};

long xp2 = re.rniPutStringArray(sa);

re.rniSetAttr(xp5, "names", xp2);

// ok, we have a proper list now

// we could use assign and then eval "b<-data.frame(b)", but for now let's build it by hand:

String rn[] = {"1", "2", "3"};

long xp7 = re.rniPutStringArray(rn);

re.rniSetAttr(xp5, "row.names", xp7);

long xp6 = re.rniPutString("data.frame");

re.rniSetAttr(xp5, "class", xp6);

// assign the whole thing to the "b" variable

re.rniAssign("b", xp5, 0);

{

System.out.println("Parsing");

long e=re.rniParse("data(iris)", 1);

System.out.println("Result = "+e+", running eval");

long r=re.rniEval(e, 0);

System.out.println("Result = "+r+", building REXP");

REXP x=new REXP(re, r);

System.out.println("REXP result = "+x);

}

{

System.out.println("Parsing");

long e=re.rniParse("iris", 1);

System.out.println("Result = "+e+", running eval");

long r=re.rniEval(e, 0);

System.out.println("Result = "+r+", building REXP");

REXP x=new REXP(re, r);

System.out.println("REXP result = "+x);

}

{

System.out.println("Parsing");

long e=re.rniParse("names(iris)", 1);

System.out.println("Result = "+e+", running eval");

long r=re.rniEval(e, 0);

System.out.println("Result = "+r+", building REXP");

REXP x=new REXP(re, r);

System.out.println("REXP result = "+x);

String s[]=x.asStringArray();

if (s!=null) {

int i=0; while (i<s.length) { System.out.println("["+i+"] \""+s[i]+"\""); i++; }

}

}

{

System.out.println("Parsing");

long e=re.rniParse("rnorm(10)", 1);

System.out.println("Result = "+e+", running eval");

long r=re.rniEval(e, 0);

System.out.println("Result = "+r+", building REXP");

REXP x=new REXP(re, r);

System.out.println("REXP result = "+x);

double d[]=x.asDoubleArray();

if (d!=null) {

int i=0; while (i<d.length) { System.out.print(((i==0)?"":", ")+d[i]); i++; }

System.out.println("");

}

System.out.println("");

}

{

REXP x=re.eval("1:10");

System.out.println("REXP result = "+x);

int d[]=x.asIntArray();

if (d!=null) {

int i=0; while (i<d.length) { System.out.print(((i==0)?"":", ")+d[i]); i++; }

System.out.println("");

}

}

re.eval("print(1:10/3)");

if (true) {

// so far we used R as a computational slave without REPL

// now we start the loop, so the user can use the console

System.out.println("Now the console is yours ... have fun");

re.startMainLoop();

} else {

re.end();

System.out.println("end");

}

}

}

需要修改运行参数:

在rtest类上右击→Run As→Run Configurations...

一定要在Arguments的VM arguments中添加下面的JVM参数:

-Djava.library.path="D:\ImprtantSoft\R\R-3.2.5\library\rJava\jri\x64"

输出结果:

Creating Rengine (with arguments)

R version 3.2.5 (2016-04-14) -- "Very, Very Secure Dishes"

Copyright (C) 2016 The R Foundation for Statistical Computing

Platform: x86_64-w64-mingw32/x64 (64-bit)

R is free software and comes with ABSOLUTELY NO WARRANTY.

You are welcome to redistribute it under certain conditions.

Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.

Type 'contributors()' for more information and

'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or

'help.start()' for an HTML browser interface to help.

Type 'q()' to quit R.

Rengine created, waiting for R

省略

has names:

Sepal.Length

Sepal.Width

Petal.Length

Petal.Width

Species

and once again from the list:

Sepal.Length

Sepal.Width

Petal.Length

Petal.Width

Species

[BOOLi* ]

省略

[BOOLi* ]

isTRUE? true

[LIST [REAL* (1.0)]:[SYMBOL a],([LIST [STRING "foo"]:[SYMBOL b],([LIST [INT* (1, 2, 3, 4, 5)]:[SYMBOL c],(null)])])]

Keys:

a

b

c

Contents:

[REAL* (1.0)]

[STRING "foo"]

[INT* (1, 2, 3, 4, 5)]

[REAL* (6.0)]

Parsing

Result = 237995232, running eval

Result = 237994944, building REXP

REXP result = [STRING "iris"]

Parsing

Result = 236162928, running eval

Result = 219285544, building REXP

REXP result = [省略]

Parsing

Result = 236176464, running eval

Result = 219285440, building REXP

REXP result = [STRING* ("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width", "Species")]

[0] "Sepal.Length"

[1] "Sepal.Width"

[2] "Petal.Length"

[3] "Petal.Width"

[4] "Species"

Parsing

Result = 236176320, running eval

Result = 219852656, building REXP

REXP result = [REAL* 省略

REXP result = [INT* (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)]

1, 2, 3, 4, 5, 6, 7, 8, 9, 10

[1] 0.3333333 0.6666667 1.0000000 1.3333333 1.6666667 2.0000000 2.3333333

[8] 2.6666667 3.0000000 3.3333333

Now the console is yours ... have fun

rBusy(0)

rtest2类:

package testR;

import java.awt.Dimension;

import java.awt.FileDialog;

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.io.PrintStream;

import javax.swing.JFrame;

import javax.swing.JScrollPane;

import javax.swing.JTextArea;

import org.rosuda.JRI.RConsoleOutputStream;

import org.rosuda.JRI.RMainLoopCallbacks;

import org.rosuda.JRI.Rengine;

class TextConsole2 implements RMainLoopCallbacks

{

JFrame f;

public JTextArea textarea = new JTextArea();

public TextConsole2() {

f = new JFrame();

f.getContentPane().add(new JScrollPane(textarea));

f.setSize(new Dimension(800,600));

f.show();

}

public void rWriteConsole(Rengine re, String text, int oType) {

textarea.append(text);

}

public void rBusy(Rengine re, int which) {

System.out.println("rBusy("+which+")");

}

public String rReadConsole(Rengine re, String prompt, int addToHistory) {

System.out.print(prompt);

try {

BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

String s=br.readLine();

return (s==null||s.length()==0)?s:s+"\n";

} catch (Exception e) {

System.out.println("jriReadConsole exception: "+e.getMessage());

}

return null;

}

public void rShowMessage(Rengine re, String message) {

System.out.println("rShowMessage \""+message+"\"");

}

public String rChooseFile(Rengine re, int newFile) {

FileDialog fd = new FileDialog(f, (newFile==0)?"Select a file":"Select a new file", (newFile==0)?FileDialog.LOAD:FileDialog.SAVE);

fd.show();

String res=null;

if (fd.getDirectory()!=null) res=fd.getDirectory();

if (fd.getFile()!=null) res=(res==null)?fd.getFile():(res+fd.getFile());

return res;

}

public void rFlushConsole (Rengine re) {

}

public void rLoadHistory (Rengine re, String filename) {

}

public void rSaveHistory (Rengine re, String filename) {

}

}

public class rtest2 {

public static void main(String[] args) {

System.out.println("Press <Enter> to continue (time to attach the debugger if necessary)");

try { System.in.read(); } catch(Exception e) {};

System.out.println("Creating Rengine (with arguments)");

Rengine re=new Rengine(args, true, new TextConsole2());

System.out.println("Rengine created, waiting for R");

if (!re.waitForR()) {

System.out.println("Cannot load R");

return;

}

System.out.println("re-routing stdout/err into R console");

System.setOut(new PrintStream(new RConsoleOutputStream(re, 0)));

System.setErr(new PrintStream(new RConsoleOutputStream(re, 1)));

System.out.println("Letting go; use main loop from now on");

}

}

输出结果:

Press <Enter> to continue (time to attach the debugger if necessary)

Creating Rengine (with arguments)

Rengine created, waiting for R

re-routing stdout/err into R console

rBusy(0)

 

转载请注明链接:

http://www.cnblogs.com/homewch/p/5659756.html

相关阅读:
Top