Renjin - как использовать значения, созданные в Java

Я использую renjin, и я пытаюсь использовать значения, которые я сгенерировал в коде Java с помощью r-кода, например:

int x = 7;

try
{
   engine.eval("tmp<-c(x, 4)");
   engine.eval("print(tmp)");
}
catch (ScriptException ex) 
{
   ;
}

Тем не менее, это не работает, так как двигатель, очевидно, не может работать с х. Есть ли простой способ решить эту проблему?

2 ответа

Решение

Вы можете объединить переменную в строку как литерал, как я написал в комментарии:

engine.eval("tmp<-c(" + x + ", 4)");

Это работает, потому что (я предполагаю) движок должен оценивать литеральные выражения (с числовыми значениями вместо переменных), и вышеприведенное выражение по существу проходит tmp<-c(7, 4) через конкатенацию (комбинацию) строк и целочисленных значений. Я бы также попытался сначала запустить команду для сохранения переменной, а затем сослаться на нее, то есть:

engine.eval(x <- 7);

Тогда попробуйте свое оригинальное выражение. Я не знаком с Renjin, хотя, так что это немного выстрел в темноте.

Renjin использует интерфейс javax.script, который дает вам много возможностей для взаимодействия со средой R. Смотрите документацию здесь: http://docs.oracle.com/javase/6/docs/technotes/guides/scripting/programmer_guide/

Чтобы установить переменные в глобальной среде R, вы можете использовать метод put(). Вот некоторые примеры:

engine.put("x", 4);
engine.put("y", new double[] { 1d, 2d, 3d, 4d });
engine.put("z", new org.renjin.sexp.DoubleArrayVector(1,2,3,4,5));
engine.put("obj", new HashMap());

Renjin будет неявно преобразовывать примитивы, массивы примитивов и экземпляры java.lang.String в объекты R. Объекты Java будут обернуты как R external объекты.

Из кода R Renjin позволяет вам манипулировать объектами Java, используя $ оператор, например:

obj$put("a", 1)
obj$put("b", 2) 

print(obj$size())
print(obj$get("b"))

Вы также можете предоставить свои собственные реализации объектов R, расширив классы в пакете org.renjin.sexp. Например:

public class MyDoubleVector extends DoubleVector {

  public double getElementAsDouble(int index) {
       // lookup value in database
       return index;
  }

  public int length() {
       // query length in database
       return length;
  }
}
Другие вопросы по тегам