Skip to content

Using substitute to access the expression related to a promise

5 messages · Hadley Wickham, Duncan Murdoch, Gabor Grothendieck

#
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:
x
[1] 3

Is this a bug in substitute?
R version 2.13.0 (2011-04-13)
Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit)
...

Hadley
#
On 02/05/2011 9:53 AM, Hadley Wickham wrote:
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
#
On Mon, May 2, 2011 at 9:53 AM, Hadley Wickham <hadley at rice.edu> wrote:
It works differently if the assign environment is the global
environment or not.  This is actually mentioned on the help page for
substitute though its precise meaning may not be completely clear from
the wording.

Try this:
{
    message("assigning...")
    a + b
}
#
On Mon, May 2, 2011 at 10:10 AM, Duncan Murdoch
<murdoch.duncan at gmail.com> wrote:
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.
#
On Mon, May 2, 2011 at 9:10 AM, Duncan Murdoch <murdoch.duncan at gmail.com> wrote:
I guess you mean this sentence: "If it is an ordinary variable, its
value is substituted, unless ?env? is ?.GlobalEnv? in which case the
symbol is left unchanged."  But I think the conditioning is confusing,
because it implies that this condition only comes into play if x is an
ordinary variable, which is not the case in my example.

Hadley