[Rd] How allocate STRSXP outside of gc

Vadim Ogranovich vograno at evafunds.com
Tue Apr 12 22:38:17 CEST 2005


Thanks Duncan!

R_PreserveObject will do. One thought, wouldn't it make sense to modify
R_PreserveObject to return its argument?
This would allow things like

static SEXP fooSexp = R_PreserveObject(mkChar("foo"));

and would also make R_PreserveObject more similar to Rf_protect().

There should be no problem w/ backward compatability, at least not that
I could see.

Thanks,
Vadim

> -----Original Message-----
> From: Duncan Temple Lang [mailto:duncan at wald.ucdavis.edu] 
> Sent: Tuesday, April 12, 2005 12:52 PM
> To: Vadim Ogranovich
> Cc: r-devel at stat.math.ethz.ch
> Subject: Re: [Rd] How allocate STRSXP outside of gc
> 
> Look at R_PreserveObject to see if it will do what you want.
> It certainly used to.
> 
> SEXP getFoo()
> {
>   static SEXP val = NULL;
> 
>   if(!val) {
>     val = mkChar("foo");
>     R_PreserveObject(val);
>   }
> 
>   return(val);
> }
> 
> 
> You may want to have a routine that is called when the 
> package is unloaded that calls R_ReleaseObject().
> 
> Alternatively, store the object in a package's namespace 
> environment and it won't be gc'ed.
> 
>  D.
> 
> 
> Vadim Ogranovich wrote:
> > Hi,
> >  
> > I am trying to figure a way to allocate a string SEXP so that gc() 
> > won't ever collect it.
> >  
> > Here is a little bit of a background. Suppose I want to write a 
> > .Call-callable function that upon each call returns the same value, 
> > say
> > mkChar("foo"):
> >  
> > SEXP getFoo() {
> >    return mkChar("foo");
> > }
> >  
> > The above implementation doesn't take advantage of the fact that
> > mkChar("foo") could be pre-computed only once, and then the 
> function 
> > would return the pre-computed value. So the question is how 
> to create 
> > this precomputed value.
> >  
> >  
> > The closest thing I could find in the sources is 
> R_NaString, but I was 
> > not able to trace down how it comes about.
> >  
> >  
> > Thanks,
> > Vadim
> >  
> >  
> > P.S. I was able to solve a similar problem with symbols. If 
> I need a 
> > symbol "foo", I do
> >  
> > static SEXP  FooSymbol = install("foo");
> >  
> > and then use FooSymbol instead of install("foo")
> >  
> >  
> >  
> > 
> > 	[[alternative HTML version deleted]]
> > 
> > ______________________________________________
> > R-devel at stat.math.ethz.ch mailing list 
> > https://stat.ethz.ch/mailman/listinfo/r-devel
> 
> -- 
> Duncan Temple Lang                duncan at wald.ucdavis.edu
> Department of Statistics          work:  (530) 752-4782
> 371 Kerr Hall                     fax:   (530) 752-7099
> One Shields Ave.
> University of California at Davis
> Davis, CA 95616, USA
> 
> 
> 
>



More information about the R-devel mailing list