From jeff.horner at vanderbilt.edu  Thu Oct  1 18:37:28 2009
From: jeff.horner at vanderbilt.edu (Jeff Horner)
Date: Thu, 01 Oct 2009 11:37:28 -0500
Subject: [Rd] creating environments in package's C code
In-Reply-To: <4AC4D3C5.7090609@vanderbilt.edu>
References: <4AC4CBD9.7010309@mx.uni-saarland.de>
	<4AC4D3C5.7090609@vanderbilt.edu>
Message-ID: <4AC4DAC8.6010107@vanderbilt.edu>

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;
> }

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;
}

> 
> 
> 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



[Rd] creating environments in package's C code
Jeff Horner