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变量 [] "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. 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-
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