r
语言与java语言的区别和优劣首先这两种语言相比较都是一种程序的计算机语言,他们一个是从简单上,一个是从准确上,其次呢,他一个对语言的一个覆盖范围上的一个简便程度和他语言的一个准确程度上它都是有区别的,优点的话,它就是比较的简洁和准确Java调用R,就是使用JRI.jar中的Api,执行一条R语言
命令,当然首先你要了解R语言的语法。\x0d\x0a1.JRI中主要的API\x0d\x0aRengine R引擎,通过它进行R语言的启动、运算、画图、关闭等功能。\x0d\x0a一个线程只能实例化一次,推荐使用单例模式。\x0d\x0a实例化代码:\x0d\x0aRengine engine = new Rengine(null,false,null)\x0d\x0aRengine.versionCheck() //R版本校验,返回true:版本校验通过 返回false:版本校验未通过\x0d\x0aengine.waitForR() //R
加载校验,返回true:加载成功 返回false:加载失败\x0d\x0aengine.end() //结束R,在后续没有调用R的情况下使用,否则R将退出,不能继续使用R。\x0d\x0a\x0d\x0a2.REXP\x0d\x0aR计算结果表达式\x0d\x0aREXP rexp = engine.eval_r(String str) //执行R命令,返回结果REXP\x0d\x0arexp.asInt() rexp.asDouble() rexp.as.. //将REXP转成java类型\x0d\x0aengine.assign(String name,double d) //定义R变量,name为R中变量的名字\x0d\x0a\x0d\x0a以上大概了解了JRI的基本API,下面写个简单的例子。\x0d\x0a//求n个数的最大值\x0d\x0aRengine engine = new Rengine(null,false,null)\x0d\x0aint[] arr = new int[]{-1,2,1,-3,5,4,-2}\x0d\x0aengine.assign("x",arr)\x0d\x0aREXP rexp = engine.eval_r("max(x)")\x0d\x0aint max = rexp.asInt()\x0d\x0aSystem.out.println(max)\x0d\x0aengine.end()可以。
(一) 在R里下载“Rserve”包,并安装
安装好后,
运行如下命令启动“Rserver”
>library(Rserve)
>Rserve()
Starting Rserve...
"D:\PROGRA~1\R\R-30~1.1\library\Rserve\libs\i386\Rserve.exe"
>
(二) 建立java工程,导入必要的包,写出测试用例
目录结构如下(标红色的是需要的):
Test.java 内容
package com.rTest
import org.rosuda.REngine.REXP
import org.rosuda.REngine.Rserve.RConnection
public class Test {
public static void main(String[] args) {
try {
RConnection c = new RConnection()
REXP x = c.eval("R.version.string")
System.out.println(x.asString())
} catch (Exception e) {
e.printStackTrace()
}
}
}
运行即可
2.3 可能出现的错误
2.3.1 Connection refused: connect
org.rosuda.REngine.Rserve.RserveException: Cannot connect: Connection refused: connect
at org.rosuda.REngine.Rserve.RConnection.<init>(RConnection.java:88)
at org.rosuda.REngine.Rserve.RConnection.<init>(RConnection.java:60)
at org.rosuda.REngine.Rserve.RConnection.<init>(RConnection.java:44)
at com.rTest.Test.main(Test.java:9)
这是由于“Rserve” 服务器没有启动起来的原因,试试在R内运行如下语句
>library(Rserve)
>Rserve()