rJava是一个R语言和Java语言的通信接口,通过底层JNI实现调用,允许在R中直接调用Java的对象和方法。
步骤:
1.本地系统:
Win7 64bit 企业版, jdk1.8.0_45,R3.2.2。
2.在R中安装rJava:
下载好R-3.2.2-win.exe,直接打开。输入:
> install.packages("rJava")
#加载rJava
> library(rJava)
> .jinit()
#R调用Java变量测试
> s <- .jnew("java/lang/String", "Hello World!")
> s
[1] "Java-Object{Hello World!}"
3.设置系统环境变量:
R_HOME: C:Program FilesRR-3.2.2
RJAVA_HOME:C:Program FilesRR-3.2.2library
Java
PATH:%R_HOME%in;%R_HOME%inx64;%RJAVA_HOME%jrix64;
4.测试代码:
import org.rosuda.JRI.Rengine; /** * Created by shida.min on 2015/10/27. */ public class DemoRJava { static { System.loadLibrary("jri"); } public static void main(String[] args) { DemoRJava demo = new DemoRJava(); demo.callRJava(args); } // -Djava.library.path="C:Program FilesRR-3.2.2library Javajrix64" public void callRJava(String[] args) { System.out.println(System.getProperty("java.library.path")); Rengine re = new Rengine(args, false, null); if (!re.waitForR()) { System.out.println("Cannot load R"); return; } //打印变量 String version = re.eval("R.version.string").asString(); System.out.println(version); //循环打印数组 double[] arr = re.eval("rnorm(10)").asDoubleArray(); for (double a : arr) { System.out.print(a + ","); } re.end(); } }
在工程中导入JRI.jar, JRIEngine.jar, REngine.jar三个包。
使用 IntelliJ idea 作为 java IDE, 设置VM options:
-Djava.library.path="C:Program FilesRR-3.2.2library Javajrix64"
首次运行后报错:
java.lang.UnsatisfiedLinkError: C:Program FilesRR-3.2.2library Javajrix64jri.dll: Can't find dependent libraries Disconnected from the target VM, address: '127.0.0.1:49750', transport: 'socket' at java.lang.ClassLoader$NativeLibrary.load(Native Method) at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1937) at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1855) at java.lang.Runtime.loadLibrary0(Runtime.java:870) at java.lang.System.loadLibrary(System.java:1122) at com.xy.DemoRJava.<clinit>(DemoRJava.java:10) Exception in thread "main"
试了许多办法,都没用,后来在http://stackoverflow.com/questions/19100875/java-r-interface-jri-setup 上找到方法。
把R目录下的所有*.dll文件都拷贝到jdk的bin目录下,并在程序中加上
static { System.loadLibrary("jri"); }
测试通过,mark。