另一个R和Java通信的库JRI,并不支持多会话机制。关于R和Java通信的其他文章,请参考:解惑rJava R与Java的高速通道, Rserve与Java的跨平台通信
Rsession项目主页: https://code.google.com/p/rsession/
系统环境
Win7 64bit
R: 3.0.1 x86_64-w64-mingw32/x64 b4bit
发行包下载:解压缩就可以直接使用了
http://rsession.googlecode.com/files/libRsession.zip
包括3个jar包:REngine.jar, Rserve.jar, Rsession.jar
源代码下载:(SVN)
http://rsession.googlecode.com/svn/trunk/Rsession/
具体调用代码如下:
package org.conan.r.rsession; import java.io.File; import java.util.Properties; import org.math.R.RserverConf; import org.math.R.Rsession; import org.rosuda.REngine.REXPMismatchException; public class RsessionDemo { public static void main(String args[]) throws REXPMismatchException { RserverConf rconf = new RserverConf("192.168.1.201", 6311, "conan", "conan", new Properties()); Rsession s = Rsession.newInstanceTry(System.out, rconf); // 执行R脚本 double[] rand = s.eval("rnorm(5)").asDoubles(); System.out.println(rand); // 创建一个R对象 s.set("demo", Math.random()); s.eval("ls()"); // 保存R运行时状态到文件 s.save(new File("./output/save.Rdata"), "demo"); // 删除R对象demo s.rm("demo"); s.eval("ls()"); // 从文件加载R环境 s.load(new File("./output/save.Rdata")); s.eval("ls()"); s.eval("print(demo)"); // 创建一个data.frame对象 s.set("df", new double[][] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 }, { 10, 11, 12 } }, "x1", "x2", "x3"); double df$x1_3 = s.eval("df$x1[3]").asDouble(); System.out.println(df$x1_3); s.rm("df"); // 生成一个图形文件 s.eval("getwd()"); s.toJPEG(new File("./output/plot.png"), 400, 400, "plot(rnorm(10))"); // 以HTML格式输出 String html = s.asHTML("summary(rnorm(100))"); System.out.println(html); // 以文本格式输出 String txt = s.asString("summary(rnorm(100))"); System.out.println(txt); // 安装新类库 System.out.println(s.installPackage("sensitivity", true)); s.end(); } }
对比Rserve的JavaAPI(参考文章:Rserve与Java的跨平台通信),是不是感觉Rsession再友好呢!这样就能在不打开R编译器的情况下,使用R的底层包服务。更适合于封装R。
我们在使用RStudio时,任务管理器中也可以看到rsession的进程!猜一下,RStudio也在使用rsession做程序接口。