On Jan 11, 2011, at 6:55 PM, <[email protected]> <[email protected]>
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
>>>
>>> ______________________________________________
>>> [email protected] mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>>
>>>
>>
>> ______________________________________________
>> [email protected] 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: [email protected]
> Iowa City, IA 52242 WWW: http://www.stat.uiowa.edu
______________________________________________
[email protected] mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel