From ripley at stats.ox.ac.uk  Tue Mar  8 18:44:41 2005
From: ripley at stats.ox.ac.uk (Prof Brian Ripley)
Date: Tue Mar  8 18:44:50 2005
Subject: [Rd] Bug in handling of promises?
In-Reply-To: <bemr21dafvf5sp687mk0jpob2rual9ilan@4ax.com>
References: <bemr21dafvf5sp687mk0jpob2rual9ilan@4ax.com>
Message-ID: <Pine.LNX.4.61.0503081742530.3789@gannet.stats>

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,                  ripley@stats.ox.ac.uk
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


[Rd] Bug in handling of promises?
Prof Brian Ripley