}
/* High-level API - do not use RNI methods unless there is no other way
to accomplish what you want */
try {
REXP x;
re.eval("library(statnet)");
re.eval("data(\"faux.magnolia.high\")", false);
re.eval("fmh <- faux.magnolia.high", false);
re.eval("plot(fmh,displayisolates = FALSE, vertex.col = \"Grade\", vertex.cex = 0.7)");
re.eval("data(iris)",false);
System.out.println(x=re.eval("iris"));
// generic vectors are RVector to accomodate names
RVector v = x.asVector();
if (v.getNames()!=null) {
System.out.println("has names:");
for (Enumeration e = v.getNames().elements() ; e.hasMoreElements() ;) {
System.out.println(e.nextElement());
}
}
// for compatibility with Rserve we allow casting of vectors to lists
RList vl = x.asList();
String[] k = vl.keys();
if (k!=null) {
System.out.println("and once again from the list:");
int i=0; while (i<k.length) System.out.println(k[i++]);
}
// get boolean array
System.out.println(x=re.eval("iris[[1]]>mean(iris[[1]])"));
// R knows about TRUE/FALSE/NA, so we cannot use boolean[] this way
// instead, we use int[] which is more convenient (and what R uses internally anyway)
int[] bi = x.asIntArray();
{
int i = 0; while (i<bi.length) { System.out.print(bi[i]==0?"F ":(bi[i]==1?"T ":"NA ")); i++; }
System.out.println("");
}
// push a boolean array
boolean by[] = { true, false, false };
re.assign("bool", by);
System.out.println(x=re.eval("bool"));
// asBool returns the first element of the array as RBool
// (mostly useful for boolean arrays of the length 1). is should return true
System.out.println("isTRUE? "+x.asBool().isTRUE());
// now for a real dotted-pair list:
System.out.println(x=re.eval("pairlist(a=1,b='foo',c=1:5)"));
RList l = x.asList();
if (l!=null) {
int i=0;
String [] a = l.keys();
System.out.println("Keys:");
while (i<a.length) System.out.println(a[i++]);
System.out.println("Contents:");
i=0;
while (i<a.length) System.out.println(l.at(i++));
}
System.out.println(re.eval("sqrt(36)"));
} catch (Exception e) {
System.out.println("EX:"+e);
e.printStackTrace();
}
// Part 2 - low-level API - for illustration purposes only!
//System.exit(0);
// simple assignment like a<-"hello" (env=0 means use R_GlobalEnv)
long xp1 = re.rniPutString("hello");
re.rniAssign("a", xp1, 0);
// Example: how to create a named list or data.frame
double da[] = {1.2, 2.3, 4.5};
double db[] = {1.4, 2.6, 4.2};
long xp3 = re.rniPutDoubleArray(da);
long xp4 = re.rniPutDoubleArray(db);
// now build a list (generic vector is how that's called in R)
long la[] = {xp3, xp4};
long xp5 = re.rniPutVector(la);
// now let's add names
String sa[] = {"a","b"};
long xp2 = re.rniPutStringArray(sa);
re.rniSetAttr(xp5, "names", xp2);
// ok, we have a proper list now
// we could use assign and then eval "b<-data.frame(b)", but for now let's build it by hand:
String rn[] = {"1", "2", "3"};
long xp7 = re.rniPutStringArray(rn);
re.rniSetAttr(xp5, "row.names", xp7);
long xp6 = re.rniPutString("data.frame");
re.rniSetAttr(xp5, "class", xp6);
// assign the whole thing to the "b" variable
re.rniAssign("b", xp5, 0);
{
System.out.println("Parsing");
long e=re.rniParse("data(iris)", 1);
System.out.println("Result = "+e+", running eval");
long r=re.rniEval(e, 0);
System.out.println("Result = "+r+", building REXP");
REXP x=new REXP(re, r);
System.out.println("REXP result = "+x);
}
{
System.out.println("Parsing");
long e=re.rniParse("iris", 1);
System.out.println("Result = "+e+", running eval");
long r=re.rniEval(e, 0);
System.out.println("Result = "+r+", building REXP");
REXP x=new REXP(re, r);
System.out.println("REXP result = "+x);
}
{
System.out.println("Parsing");
long e=re.rniParse("names(iris)", 1);
System.out.println("Result = "+e+", running eval");
long r=re.rniEval(e, 0);
System.out.println("Result = "+r+", building REXP");
REXP x=new REXP(re, r);
System.out.println("REXP result = "+x);
String s[]=x.asStringArray();
if (s!=null) {
int i=0; while (i<s.length) { System.out.println("["+i+"] \""+s[i]+"\""); i++; }
}
}
{
System.out.println("Parsing");
long e=re.rniParse("rnorm(10)", 1);
System.out.println("Result = "+e+", running eval");
long r=re.rniEval(e, 0);
System.out.println("Result = "+r+", building REXP");
REXP x=new REXP(re, r);
System.out.println("REXP result = "+x);
double d[]=x.asDoubleArray();
if (d!=null) {
int i=0; while (i<d.length) { System.out.print(((i==0)?"":", ")+d[i]); i++; }
System.out.println("");
}
System.out.println("");
}
{
REXP x=re.eval("1:10");
System.out.println("REXP result = "+x);
int d[]=x.asIntArray();
if (d!=null) {
int i=0; while (i<d.length) { System.out.print(((i==0)?"":", ")+d[i]); i++; }
System.out.println("");
}
}