package com.activequant.utils;
import javax.script.ScriptEngine;
import javax.script.ScriptException;
import org.renjin.eval.Context;
import org.renjin.script.RenjinScriptEngineFactory;
import org.renjin.sexp.DoubleVector;
/**
*
* @author GhostRider
*
*/
public class RenjinCore {
private ScriptEngine engine;
/**
* Initialized the renjin engine.
*/
public RenjinCore() {
try {
Context context = Context.newTopLevelContext();
context.getGlobals().setLibraryPaths("");
context.init();
engine = new RenjinScriptEngineFactory().getScriptEngine(context);
} catch (Exception ex) {
ex.printStackTrace();
}
}
/**
* Executes an R command in the engine environment.
* @param cmd
* @throws ScriptException
*/
public void execute(String cmd) throws ScriptException {
engine.eval(cmd);
}
/**
* Puts an object into the engine's environment.
* @param key
* @param object
*/
public void put(String key, Object object) {
engine.put(key, object);
}
/**
* Fetches an object from the engine's environment.
* @param key
* @return a renjin object, for example Double Vector
*/
public Object get(String key) {
return engine.get(key);
}
/**
* convenience method. fetches an object from engine env and casts it to double vector.
*
* @param key
* @return
*/
public DoubleVector getDoubleVector(String key) {
return (DoubleVector) engine.get(key);
}
/**
* Returns a single value as double. Can break.
*
* @param key
* @return
*/
public Double getDouble(String key){
return ((DoubleVector) engine.get(key)).get(0);
}
/**
* Just some basic fun testing method.
*
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
RenjinCore r = new RenjinCore();
r.put("a", 1);
r.execute("b = c(a, sqrt(a + 1));");
r.execute("b = c(a, sqrt(a + 1), sqrt(50));");
r.execute("d = sum(b);");
// r.execute("sdb = sd(b);");
//r.execute("plot(b);");
System.out.println("Obj: " + r.get("b") + " " + r.get("b").getClass());
System.out.println(r.get("d"));
}
}