From murdoch at stats.uwo.ca  Fri May 19 16:15:20 2006
From: murdoch at stats.uwo.ca (Duncan Murdoch)
Date: Fri, 19 May 2006 10:15:20 -0400
Subject: [Rd] delayedAssign and interrupts
In-Reply-To: <446DCE07.2080504@gmail.com>
References: <446DCE07.2080504@gmail.com>
Message-ID: <446DD2F8.5060900@stats.uwo.ca>

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.

Duncan Murdoch



[Rd] delayedAssign and interrupts
Duncan Murdoch