From luke at stat.uiowa.edu  Fri May 19 16:37:22 2006
From: luke at stat.uiowa.edu (Luke Tierney)
Date: Fri, 19 May 2006 09:37:22 -0500 (CDT)
Subject: [Rd] delayedAssign and interrupts
In-Reply-To: <446DD2F8.5060900@stats.uwo.ca>
References: <446DCE07.2080504@gmail.com> <446DD2F8.5060900@stats.uwo.ca>
Message-ID: <Pine.LNX.4.64.0605190920520.9980@nokomis.stat.uiowa.edu>

On Fri, 19 May 2006, Duncan Murdoch wrote:

> On 5/19/2006 9:54 AM, Roger D. Peng wrote:
>> I noticed something recently that I thought was odd:
>>
>> delayedAssign("x", { Sys.sleep(5); 1 })
>> x  ## Hit Ctrl-C within the first second or 2
>>
>> gives me:
>>
>> > delayedAssign("x", { Sys.sleep(5); 1 })
>> > x  ## Hit Ctrl-C within the first second or two
>>
>> > x
>> Error: recursive default argument reference
>> >
>>
>> My only problem here is that now I'm stuck---there's no way to recover whatever
>> 'x' was supposed to be (i.e. 1).
>>
>> In reality, I want 'x' to be a promise to load a moderately large data object.
>> But if I (or a user) Ctrl-C's during the load I'll have to start from scratch.
>> Is there anyway to recover the promise (or the value of the expression) in case
>> of an interrupt?
>
> I don't know of one.  Normally substitute(x) is supposed to retrieve the
>  promise expression, but by a strange quirk of history, it does not
> work when x is in .GlobalEnv.
>
> I'd say the behaviour you're seeing is a bug.  If I do
>
> > x <- 2
> > x <- {Sys.sleep(1); 1}  # Break before complete
>
> > x
> [1] 2
>
> nothing is changed about x.  I would think the same thing should happen
> when x is a promise:  if the evaluation of the promised expression
> fails, the promise should not be changed.

I don't think this is a clear as you make it out--given that these
uses of promises often have side effects, and some of those side
effects may have occurred prior to an error, it isn't clear that
pretending like no evaluation had happened is the right way to go.

It should not be too hard to write a delayedAssignmentReset function
if that is really useful; alternatively a user of delayedAssign should
be able to arrange via tryCatch to chatch interrupts and re-install
the delayed assignment if one occurs.

It might not be a bad idea for us to look into the promise evaluation
internals and see if we should/can separate the promise black-holing
from detection of recursive default argument references to get more
reasonable error messages in these situations and maybe allow
resetting more gnerally.  But anything done here had better keep
efficiency in mind since this is prety core to R function call
evaluation.  I may try to look into this when I get back to workign on
R internals.

luke



-- 
Luke Tierney
Chair, Statistics and Actuarial Science
Ralph E. Wareham Professor of Mathematical Sciences
University of Iowa                  Phone:             319-335-3386
Department of Statistics and        Fax:               319-335-3017
    Actuarial Science
241 Schaeffer Hall                  email:      luke at stat.uiowa.edu
Iowa City, IA 52242                 WWW:  http://www.stat.uiowa.edu



[Rd] delayedAssign and interrupts
Luke Tierney