1

我已安装 JRI 以在 Windows 7 上使用 32 位 R 3.0.2 和 Java jdk1.7.0_45 与 NetBeans 7.4 一起运行。

我正在使用以下 Java 函数。

import org.rosuda.JRI.Rengine;
import org.rosuda.JRI.REXP;
import org.rosuda.JRI.RList;

void testJRI(){

    // Start JRI engine. 
    String[] Rargs = {"--vanilla"};
    Rengine re = new Rengine(Rargs, false, null);

    if (!re.waitForR()) {
        System.out.println("Cannot load R");
        return null;
    }

    REXP load=re.eval("source('C:\\\\searchPath\\\\nonparametricAnova.r')");
    re.end();

    return;
}

第一次调用该函数时,一切正常。但是第二次,变量 load 为 null - 表示失败。

我用以下简单脚本替换了 nonparametricAnova.r R 函数

simple<-function(){
  a=1
  a
}

我将其命名为 simple.r 并使用

    REXP load=re.eval("source('C:\\\\searchPath\\\\simple.r')");

现在,第二次通过,它挂起

Rengine re = new Rengine(Rargs, false, null);

我注意到

load=re.eval("refClusterMeasurements<-read.csv(\"C:/SearchPath/fileName.csv\", header=TRUE)");

即使“name.csv”是一个最小大小的文件,第二次也会失败。

4

1 回答 1

1

此版本有效:

package stackoverflow;

import org.rosuda.JRI.REXP;
import org.rosuda.JRI.Rengine;

/**
 *
 * @author yschellekens
 */
public class StackOverflow {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {




 // Start JRI engine. 
    String[] Rargs = {"--vanilla"};
    Rengine re = new Rengine(Rargs, false, null);

      re.eval("source('C:/Users/yschellekens.INTRANET/Desktop/java projects/simple.R')");
       REXP value =re.eval("as.integer(a<-simple())");
   int a  = value.asInt();
        System.out.println(a);


    }
} 

使用以下 R 文件:

simple<-function(){
  a=1
  return(a)
}

Java 输出:

run:
1

注意几个区别:

  1. REXP load=之前不要使用re.eval("source...
  2. 保存你的 r 文件.R
  3. 将破折号更改为:/

此代码多次运行良好,如果解决了问题,请告诉我。

于 2014-04-20T06:08:33.760 回答