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

Duncan Murdoch murdoch.duncan at gmail.com
Sun Apr 29 13:50:05 CEST 2012

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"
substitute(x, e)

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

Duncan Murdoch

More information about the R-devel mailing list