[Rd] Using substitute to access the expression related to a promise

Gabor Grothendieck ggrothendieck at gmail.com
Mon May 2 16:18:56 CEST 2011

On Mon, May 2, 2011 at 10:10 AM, Duncan Murdoch
<murdoch.duncan at 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

More information about the R-devel mailing list