Я установил JRI для работы с NetBeans 7.4 с использованием 32-разрядных R 3.0.2 и Java jdk1.7.0_45 в Windows 7.
Я использую следующую функцию 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, имеет нулевую ошибку.
Я заменил функцию 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" является файлом минимального размера.
Эта версия работает:
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
Обратите внимание на несколько отличий:
REXP load=
перед re.eval("source...
.R
/
Этот код работает много раз, пожалуйста, дайте мне знать, если это решит проблему.