The following note in ?force may help

Note:

     'force' does not force the evaluation of promises.

It is there because people have been confused before.


On Tue, 8 Mar 2005, Duncan Murdoch wrote:

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.

-- Brian D. Ripley, [EMAIL PROTECTED] Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/ University of Oxford, Tel: +44 1865 272861 (self) 1 South Parks Road, +44 1865 272866 (PA) Oxford OX1 3TG, UK Fax: +44 1865 272595

______________________________________________
R-devel@stat.math.ethz.ch mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to