R/Java
From QERM Wiki
(Difference between revisions)
(Added example) |
(Added info on different APIs) |
||
Line 18: | Line 18: | ||
== Calling R == | == Calling R == | ||
Here is a very short example. See the links below and the example directory for more. | Here is a very short example. See the links below and the example directory for more. | ||
+ | |||
+ | public void demoCallR() throws Exception | ||
+ | { | ||
+ | REngine re = null; | ||
+ | try | ||
+ | { | ||
+ | re = REngine.engineForClass("org.rosuda.REngine.JRI.JRIEngine"); | ||
+ | |||
+ | re.assign("num", new int[] { 1 }); | ||
+ | |||
+ | REXP result = re.parseAndEval("num + 1"); | ||
+ | |||
+ | System.out.println(result.asInteger()); | ||
+ | } | ||
+ | finally | ||
+ | { | ||
+ | if (re != null) | ||
+ | { | ||
+ | re.close(); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | == Which API to use == | ||
+ | Confusingly, there are several API's to use. The recommended one is the high-level org.rosuda.REngine API. | ||
+ | |||
+ | REngine eng = REngine.engineForClass("org.rosuda.REngine.JRI.JRIEngine"); | ||
+ | eng.assign("x", "Peter") | ||
+ | |||
+ | See mailing list posts [http://permalink.gmane.org/gmane.comp.lang.r.rosuda.devel/920 here] and [https://stat.ethz.ch/pipermail/r-devel/2010-September/058397.html here]. Note that this is different than many of the examples in the links below, which all show something like this: | ||
+ | |||
// Start R | // Start R | ||
Rengine re = new Rengine(new String[] { "--no-save" }, false, null); //specify '--save', '--no-save' or '--vanilla' | Rengine re = new Rengine(new String[] { "--no-save" }, false, null); //specify '--save', '--no-save' or '--vanilla' | ||
− | + | ||
if (!re.waitForR()) | if (!re.waitForR()) | ||
{ | { | ||
Line 33: | Line 64: | ||
re.end(); | re.end(); | ||
} | } | ||
− | |||
== Helpful links== | == Helpful links== |
Latest revision as of 23:22, 9 September 2013
How to call R from a Java program
Contents |
Using JRI (from RJava)
The RJava package also allows calling Java from R.
Set up
- In R, install the RJava package (necessary?)
- The RJava package includes the JRI.jar, but to get JRIEngine.jar and REngine.jar, go to JRI files download
- Add those 3 jars to your lib directory and classpath
- Make sure the R_HOME environment variable is set
- Type $R_HOME on the command line to see if it is set and what it is set to
- In eclipse, you can add environment variables to the run configuration
- On a mac, add this line to your .profile file (in the root of your user directory, so ~/.profile)
export R_HOME=/Library/Frameworks/R.framework/Resources
- Add the native JRI library to the Java library path (either on the command line call to Java or as a VM argument in the eclipse run configuration)
-Djava.library.path=/Library/Frameworks/R.framework/Resources/library/rJava/jri/
Calling R
Here is a very short example. See the links below and the example directory for more.
public void demoCallR() throws Exception { REngine re = null; try { re = REngine.engineForClass("org.rosuda.REngine.JRI.JRIEngine"); re.assign("num", new int[] { 1 }); REXP result = re.parseAndEval("num + 1"); System.out.println(result.asInteger()); } finally { if (re != null) { re.close(); } } }
Which API to use
Confusingly, there are several API's to use. The recommended one is the high-level org.rosuda.REngine API.
REngine eng = REngine.engineForClass("org.rosuda.REngine.JRI.JRIEngine"); eng.assign("x", "Peter")
See mailing list posts here and here. Note that this is different than many of the examples in the links below, which all show something like this:
// Start R Rengine re = new Rengine(new String[] { "--no-save" }, false, null); //specify '--save', '--no-save' or '--vanilla' if (!re.waitForR()) { System.out.println("Cannot load R"); } else { // print a random number from uniform distribution System.out.println(re.eval("runif(1)").asDouble ()); // close R re.end(); }
Helpful links
- Example with eclipse
- Data types
- Example calling functions and assigning/returning values
- Setup for multiple IDEs and simple test case
- Where to get files
- Also see the jri/examples directory for the files rtest.java and rtest2.java