Simon Urbanek wrote:
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.

Interesting. I know that I patterned that function after some grepping for ENVSXP, probably src/main/serialize.c's ReadItem() as it's similar. Plus I only used what was available from the public headers.

So, if Rf_NewEnviroment is the right way to do it then make it public ;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).

Yes, that I created NewInteger is a grave oversight on my part. It's been around since R's first release (if my svn log research was correct). Thanks. I'm putting it on rapache's TODO list to take it out.

Jeff


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