JRI — Новые строки в коде R

В настоящее время я использую JRI, пакет Java, чтобы использовать некоторые функции, предоставляемые R.

Скажем, моя команда R выглядит так:

qqnorm(sql_data[["LifeExpectancy"]],
main="Life Expectancy")

Если я помещу это в свою функцию REngine.eval(), она выйдет из строя, потому что я должен ввести всю команду в одну команду "eval()". Однако он работает в моей обычной командной строке R...

Основная проблема в том, что мне трудно предсказать, будет ли следующий заказ разбит на несколько строк или нет. Итак, как я могу решить эту проблему?

Я думал о подсчете скобок, но число скобок не всегда четное. (Допустим, некоторые скобки содержатся в строках) Есть еще идеи?

Редактировать: я думаю, что моя точка зрения недостаточно очевидна. Попробуйте это:

System.out.println(re.eval("a <- c(3,4)"));
System.out.println(re.eval("a"));

System.out.println(re.eval("b <- c(3,4")); 
System.out.println(re.eval(",5)"));
System.out.println(re.eval("b"));

Вы увидите, что для первых двух команд a вы получаете

[REAL* (3.0, 4.0)] 
[REAL* (3.0, 4.0)]

Но остальное, b, выглядит так:

[NULL ]
[NULL ]
null

Это проблема с R в целом; обычно это работает, но не в JRI!


person The_F    schedule 21.10.2014    source источник
comment
Пожалуйста, покажите строку кода Java, которая дает ошибку, и покажите подробности ошибки.   -  person nicola    schedule 21.10.2014
comment
Это ошибка в R, а не в Java.   -  person The_F    schedule 21.10.2014
comment
Пожалуйста, отправьте сообщение об ошибке везде, где вы его получите. Кстати, не возникла ли ошибка при вызове REngine.eval()?   -  person nicola    schedule 21.10.2014
comment
REngine.eval() требуется допустимый оператор R. Почему вы разрываетесь на два или более звонков? Вы пытаетесь прочитать файл .R построчно и выполняете каждую строку до REngine.eval()? Если это так, просто вызовите REngine.eval("source('rfile.R')"), и скрипт будет выполнен.   -  person nicola    schedule 21.10.2014
comment
Это возможно при использовании обычной консоли R. Это просто то, как я получаю свои R-команды, и я не могу на это повлиять. Если вы попробуете это в обычной командной строке R, все будет работать отлично. Но в JRI это не так! И это моя проблема!   -  person The_F    schedule 21.10.2014


Ответы (1)


Прежде всего, глядя на System.out.println(re.eval("b <- c(3,4"));, я заметил, что ваша ошибка в R, (опечатка - пропущена вторая скобка), см. следующий код, он работает:

package stackoverflow;

import org.rosuda.JRI.REXP;
import org.rosuda.JRI.Rengine;
/**
 *
 * @author yschellekens
 */
public class StackOverflow {  

   public static void main(String[] args) throws Exception {
    String[] Rargs = {"--vanilla"};
     Rengine rengine = new Rengine(  Rargs, false, null);
        rengine.eval("b <- c(3,4)");
          REXP result=  rengine.eval("b[1]");
      System.out.println(result.asDouble());
   }
}

Вывод Java:

run:
3.0

Обратите внимание, что вы не можете передать прямо в System.out.println объект Rengine, вам нужно сначала преобразовать его в объект REXP (см. в коде).

Также ваш первый пример

qqnorm(sql_data[["LifeExpectancy"]],
main="Life Expectancy") 

включает внутренний " " и, следовательно, еще одну причину возможного сбоя

Пожалуйста, используйте: '' следующим образом:

 qqnorm(sql_data[['LifeExpectancy']],
    main='Life Expectancy') 
person Yehoshaphat Schellekens    schedule 04.02.2015