[Rd] Bug in handling of promises?
Duncan Murdoch
murdoch at stats.uwo.ca
Tue Mar 8 18:15:58 CET 2005
I'm working on a function that does adaptive sampling, and I thought
it would be handy to return the function's environment as part of the
result so that I could re-use local variables in a subsequent run. My
first try didn't work, and it came down to code like this:
> f <- function( H, prevEnv = NULL) {
+ if (!is.null(prevEnv)) H <- prevEnv$H
+ cat('Evaluate H to get ', H(1), '\n')
+ return(environment(NULL))
+ }
I thought that evaluating H would force it, so that H would be
available in the environment returned by the function. But this is
not so:
> env <- f( function(x) x^2 )
Evaluate H to get 1
> env$H
<promise: 012094D8>
> env$H(1)
Error: attempt to apply non-function
So I tried to explicitly force it:
> g <- function( H, prevEnv = NULL) {
+ if (!is.null(prevEnv)) H <- prevEnv$H
+ force(H)
+ return(environment(NULL))
+ }
but this still doesn't work:
> env <- g( function(x) x^2 )
> env$H
<promise: 01206FC0>
> env$H(1)
Error: attempt to apply non-function
It seems that I need to do an assignment to convert H from a promise
to an evaluated object:
> h <- function( H, prevEnv = NULL) {
+ if (!is.null(prevEnv)) H <- prevEnv$H
+ H <- H
+ return(environment(NULL))
+ }
> env <- h( function(x) x^2 )
> env$H
function(x) x^2
> env$H(1)
[1] 1
Is this a bug, or just the way things are?
I get the same results in both R-patched and R-devel.
Duncan Murdoch
More information about the R-devel
mailing list