[Rd] creating environments in package's C code
Simon Urbanek
simon.urbanek at r-project.org
Thu Oct 1 18:51:19 CEST 2009
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 at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>
>
More information about the R-devel
mailing list