From simon.urbanek at r-project.org  Wed Jan 12 02:45:24 2011
From: simon.urbanek at r-project.org (Simon Urbanek)
Date: Tue, 11 Jan 2011 20:45:24 -0500
Subject: [Rd] as.environment.list provides inconsistent results under
	torture
In-Reply-To: <alpine.DEB.2.00.1101111751380.1812@luke-inspiron>
References: <4D2CB092.6000303@r-enthusiasts.com>
	<792C6196-A236-44AC-B734-E38A09791CB4@r-project.org>
	<alpine.DEB.2.00.1101111751380.1812@luke-inspiron>
Message-ID: <21D8CF42-9C05-4EC0-A6CD-0C697C81D69A@r-project.org>


On Jan 11, 2011, at 6:55 PM, <luke-tierney at uiowa.edu> <luke-tierney at uiowa.edu> wrote:

> No. Lots of internal functions expect their callers to protect their arguments, for efficiency reasons. eval is called very often and almost always with argument that are protected because they are in the evaluation engine, so it would be wasteful and potentially very costly if eval protected its arguments every time it is called. (I don't tknow what the cost would be to do so in the current implementation but it could be prohibitive if we moved to some different approaches, so for now we whould continue to expect callers of eval to make sure the argumetns are protected.)
> 


Fair enough. It would be nice if this was explicitly documented since eval() is part of the API and I see several packages on CRAN using eval(LCONS(..),..) and eval(listX(...),...) - and I don't blame them (partly because one of them is mine ;)). Unfortunately all the examples in R-ext use implicitly protected arguments (as function arguments or parts of larger already protected constructs) so it's not obvious from that, either.

Thanks,
Simon




> 
> 
> On Tue, 11 Jan 2011, Simon Urbanek wrote:
> 
>> Interesting, I'd argue that the bug is in eval() not protecting its arguments since the usual convention is for functions to protect its arguments...
>> 
>> On Jan 11, 2011, at 2:33 PM, Romain Francois wrote:
>> 
>>> Hello,
>>> 
>>> Using R-devel (rev 53950), I get inconsistent results with as.environment( VECSXP ) when gctorture is on.
>>> 
>>> Consider:
>>> 
>>> a <- list( aa = rnorm, bb = runif )
>>> gctorture(TRUE)
>>> as.environment( a )
>>> 
>>> The last line sometimes produces the correct environment, but sometimes I get errors. Here are the three situations:
>>> 
>>> # good
>>>> as.environment( a )
>>> <environment: 0x100b1c978>
>>> 
>>> # not good
>>>> as.environment( a )
>>> Erreur dans length(x) : 'x' est manquant
>>> 
>>> # not good either
>>>> as.environment( a )
>>> Erreur dans list(NULL, list(aa = function (n, mean = 0, sd = 1)  :
>>> correspondance partielle de cha?nes de caract?res incorrecte
>>> 
>>> 
>>> Is it because the call made by lang4 is not protected while evaluated in this line :
>>> 
>>>   case VECSXP: {
>>> 	/* implement as.environment.list() {isObject(.) is false for a list} */
>>> 	return(eval(lang4(install("list2env"), arg,
>>> 			  /*envir = */R_NilValue, /* parent = */R_EmptyEnv),
>>> 		    rho));
>>>   }
>>> 
>>> 
>>> (BTW, this was detected in a looooooooong Rcpp-devel thread. See http://comments.gmane.org/gmane.comp.lang.r.rcpp/1336)
>>> 
>>> Romain
>>> 
>>> --
>>> Romain Francois
>>> Professional R Enthusiast
>>> +33(0) 6 28 91 30 30
>>> http://romainfrancois.blog.free.fr
>>> |- http://bit.ly/fT2rZM : highlight 0.2-5
>>> |- http://bit.ly/gpCSpH : Evolution of Rcpp code size
>>> `- http://bit.ly/hovakS : RcppGSL initial release
>>> 
>>> ______________________________________________
>>> 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
>> 
> 
> -- 
> Luke Tierney
> Statistics and Actuarial Science
> Ralph E. Wareham Professor of Mathematical Sciences
> University of Iowa                  Phone:             319-335-3386
> Department of Statistics and        Fax:               319-335-3017
>   Actuarial Science
> 241 Schaeffer Hall                  email:      luke at stat.uiowa.edu
> Iowa City, IA 52242                 WWW:  http://www.stat.uiowa.edu



[Rd] as.environment.list provides inconsistent results under torture
Simon Urbanek