Jeff,

On Oct 1, 2009, at 12:37 , Jeff Horner wrote:

Jeff Horner wrote:
Martin Becker wrote:
Dear developers,

is it possible to create environments in C code of packages?
Simply using
SEXP env;
PROTECT (env  = allocSExp(ENVSXP));
and assigning the enclosing environment with SET_ENCLOS seems to be insufficient.

Best wishes,
Here's a function I use in rapache to create one:
static SEXP NewEnv(SEXP enclos){
   SEXP env;
   PROTECT(env = allocSExp(ENVSXP));
   SET_FRAME(env, R_NilValue);
   SET_ENCLOS(env, (enclos)? enclos: R_GlobalEnv);
   SET_HASHTAB(env, R_NilValue);
   SET_ATTRIB(env, R_NilValue);
   UNPROTECT(1);
   return env;
}


eek ... that some dangerous bit of code ;). I think Rf_NewEnviroment is safer even if it's not the headers :P.


Oops! I forgot the definition of my simple function NewInteger:

static SEXP NewInteger(int i){
   SEXP val;
   PROTECT(val = NEW_INTEGER(1));
   INTEGER_DATA(val)[0] = i;
   UNPROTECT(1);
   return val;
}

I suspect you like reinventing the wheel ;). Your NewInteger is part of the R API and is called ScalarInteger(). When you need something, chances are that R has it already, so it's worth greping through the headers (and sometimes even through the main sources).

Cheers,
Simon




and an example that creates a new environment and then assigns a variable named OK an integer vector length 1 with value 0:
SEXP env = NewEnv(R_GlobalEnv);
defineVar(install("OK"),NewInteger(0),env);
Best
Jeff
______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel



______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to