From murdoch.duncan at gmail.com  Sun Apr 29 13:50:05 2012
From: murdoch.duncan at gmail.com (Duncan Murdoch)
Date: Sun, 29 Apr 2012 07:50:05 -0400
Subject: [Rd] A doubt about substitute() after delayedAssign()
In-Reply-To: <4F9CEE2B.4080507@sciviews.org>
References: <4F9CEE2B.4080507@sciviews.org>
Message-ID: <4F9D2AED.3020701@gmail.com>

On 12-04-29 3:30 AM, Philippe Grosjean wrote:
 > Hello,
 >
 > ?delayedAssign presents substitute() as a way to look at the expression
 > in the promise. However,
 >
 > msg<- "old"
 > delayedAssign("x", msg)
 > msg<- "new!"
 > x #- new!
 > substitute(x) #- x (was 'msg' ?)
 >
 > Here, we just got 'x'... shouldn't we got 'msg'?
 >
 > Same result when the promise is not evaluated yet:
 >
 > delayedAssign("x", msg)
 > substitute(x)
 >
 > In a function, that works:
 >
 > foo<- function (x = msg) substitute(x)
 > foo()
 >
 > Did I misunderstood something? It seems to me that substitute() does not
 > behaves as documented for promises created using delayedAssign().

I don't think this is well documented, but substitute() doesn't act the 
same when its "env" argument is the global environment.  So this works 
the way you'd expect:

e <- new.env()
msg <- "old"
delayedAssign("x", msg, assign=e)
msg <- "new"
e$x
substitute(x, e)

I forget what the motivation was for special-casing globalenv().

Duncan Murdoch



[Rd] A doubt about substitute() after delayedAssign()
Duncan Murdoch