Hadley Wickham
2011-May-02 13:53 UTC
[Rd] Using substitute to access the expression related to a promise
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) ... Hadley -- Assistant Professor / Dobelman Family Junior Chair Department of Statistics / Rice University http://had.co.nz/
Duncan Murdoch
2011-May-02 14:10 UTC
[Rd] Using substitute to access the expression related to a promise
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> > sessionInfo() > R version 2.13.0 (2011-04-13) > Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit) > ... > > Hadley >
Gabor Grothendieck
2011-May-02 14:10 UTC
[Rd] Using substitute to access the expression related to a promise
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
Possibly Parallel Threads
- Documentation error in subsitute
- Substitute / delayedAssign (was: Substitute unaware when promise objects are evaluated)
- Substitute unaware when promise objects are evaluated
- Inspect a "delayed" assigned whose value throws an error?
- A doubt about substitute() after delayedAssign()