On Jan 11, 2011, at 6:55 PM, <luke-tier...@uiowa.edu> <luke-tier...@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@r-project.org mailing list >>> https://stat.ethz.ch/mailman/listinfo/r-devel >>> >>> >> >> ______________________________________________ >> R-devel@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: l...@stat.uiowa.edu > Iowa City, IA 52242 WWW: http://www.stat.uiowa.edu ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel