From ggrothendieck at gmail.com  Mon May  2 16:10:54 2011
From: ggrothendieck at gmail.com (Gabor Grothendieck)
Date: Mon, 2 May 2011 10:10:54 -0400
Subject: [Rd] Using substitute to access the expression related to a
	promise
In-Reply-To: <BANLkTi=PARrZvyvDJsH4x8GDCY7kLHm+=w@mail.gmail.com>
References: <BANLkTi=PARrZvyvDJsH4x8GDCY7kLHm+=w@mail.gmail.com>
Message-ID: <BANLkTi=HEXL28FhAKadD2zz63jdk7mVyaw@mail.gmail.com>

On Mon, May 2, 2011 at 9:53 AM, Hadley Wickham <hadley at rice.edu> 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?
>
>> sessionInfo()
> R version 2.13.0 (2011-04-13)
> Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit)

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:

> e <- new.env()
> delayedAssign("x", {message("assigning..."); a + b},, e)
> substitute(x, e)
{
    message("assigning...")
    a + b
}



-- 
Statistics & Software Consulting
GKX Group, GKX Associates Inc.
tel: 1-877-GKX-GROUP
email: ggrothendieck at gmail.com



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