Второй вызов re.eval ("source ()) завершается неудачно с JRI

1

Я установил 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" является файлом минимального размера.

  • 1
    Я не знаю, что является причиной проблемы, но обратите внимание, что отсоединение скрипта не имеет никакого смысла в R.
  • 0
    Вы пытались найти другой (возможно, очень простой) скрипт вместо nonparametricAnova, чтобы увидеть, есть ли у вас такая же проблема?
Показать ещё 9 комментариев
Теги:
jri

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. Измените тире: /

Этот код работает много раз, пожалуйста, дайте мне знать, если это решит проблему.

  • 0
    Он все еще зависал после использования вышеуказанного кода. Затем я добавил re.end (); как раз перед возвращением, и это решило проблему зависания.
  • 0
    когда я использую его в качестве веб-службы, первый сделанный вызов возвращает ответ, но во второй раз он зависает, потребляя память и процессор.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню