On Wed, 17 Mar 2004, Gabor Grothendieck wrote: > > > I left out the brackets in my last email but the problem > (a reappears after have been substituted out) still remains: > > > z <- substitute( function(){a+1}, list(a=quote(b)) ) > > z > function() { > b + 1 > } > > eval(z) > function(){a+1}
Interesting. Appearances are misleading, however: > z <- substitute( function(){a+1}, list(a=quote(b)) ) > z function() { b + 1 } > f<-eval(z) > f() Error in f() : Object "b" not found > f function(){a+1} > attr(f,"source")<-NULL > f function () { b + 1 } So it isn't that eval(z) has a+1 inside, it just has a "source" attribute with a+1. Looking more carefully at z > as.list(z) [[1]] `function` [[2]] NULL [[3]] { b + 1 } [[4]] [1] "function(){a+1}" so the original construction of z has kept the source (not, however, as a "source" attribute). There is method to our madness here. It is impossible (or at least too complicated) to keep comments in the right place as a function is parsed and deparsed. In the old days, comments would occasionally move around, sometimes in very misleading ways (IIRC with if(){}else{} cases) Now we keep a copy of the source code with functions created interactively or with source(), and drop the comments on parsing. This is controlled by options("keep.source"). If you do a lot of substitute()-style programming you may want options(keep.source=FALSE). -thomas PS: There are, of course, interesting possibilities for creative abuse of the source attribute.... ______________________________________________ [EMAIL PROTECTED] mailing list https://www.stat.math.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html