Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Renjin - how to use values generated in java

Tags:

java

r

jri

renjin

I'm using renjin and I'm trying to use values I generated in the java code with the r-code, for instance:

int x = 7;

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

However, this does not work, as the engine apparently cannot work with x. Is there an easy way to solve this?

like image 300
newnewbie Avatar asked Jan 13 '23 15:01

newnewbie


1 Answers

Renjin uses the javax.script interface, for which gives you a lot of power to interact with the R environment. See the documentation here: http://docs.oracle.com/javase/6/docs/technotes/guides/scripting/programmer_guide/

To set variables within R's global environment, you can use the put() method. Here are some examples:

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 will implicitly convert primitives, arrays of primitives, and java.lang.String instances to R objects. Java objects will be wrapped as R external objects.

From R code, Renjin allows you to manipulate Java objects using the $ operator, for example:

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

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

You can also provide your own implementations of R objects by extending the classes in the org.renjin.sexp package. For example:

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;
  }
}
like image 152
akbertram Avatar answered Jan 16 '23 01:01

akbertram