[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