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 ______________________________________________ R-devel@stat.math.ethz.ch mailing list https://stat.ethz.ch/mailman/listinfo/r-devel