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;
}
}