On Mon, May 2, 2011 at 10:10 AM, Duncan Murdoch <murdoch.dun...@gmail.com> wrote: > On 02/05/2011 9:53 AM, Hadley Wickham wrote: >> >> Hi all, >> >> The help for delayedAssign suggests that you can use substitute to >> access the expression associated with a promise, and the help for >> substitute says: "If it is a promise object, i.e., a formal argument >> to a function or explicitly created using ‘delayedAssign()’, the >> expression slot of the promise replaces the symbol. >> >> But this doesn't seem to work: >> >> > a<- 1 >> > b<- 2 >> > delayedAssign("x", {message("assigning..."); a + b}) >> > substitute(x) >> x >> > x >> [1] 3 >> >> Is this a bug in substitute? >> > > I think it is a design flaw rather than a bug: the global environment is > handled specially. If you put those lines into a function you'll see > different behaviour. I think if you really carefully read the documentation > you'll find it says this. > > I suggested regularizing this several years ago, but there were worries that > it would break some common usage. > > Duncan Murdoch
Perhaps an argument could be added to indicate whether the global environment was treated specially or not. If it defaulted to the current behavior it would still be backwardly compatible. The other limitation that I have come across here is the asymmetry of being able to extract the data of the promise but not the environment. Being able to copy a promise without evaluating it is another operation that would be nice. Currently one can only do these two things at the C level. -- Statistics & Software Consulting GKX Group, GKX Associates Inc. tel: 1-877-GKX-GROUP email: ggrothendieck at gmail.com ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel