Quantcast

Is invokeRestart("abort") unstoppable?

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate
star

Is invokeRestart("abort") unstoppable?

Henrik Bengtsson-3
Hi,

I'm trying to implement an abort() method that works just like stop()
but does not signal the condition such that try() and tryCatch(...,
condition=...) are, contrary to stop(), effectively non-working with
abort() calls.

In order to achieve this, I stumbled upon invokeRestart("abort"), cf.
help("invokeRestart", package="base") that reads "Restarts are used
for establishing recovery protocols. They can be established using
withRestarts. One pre-established restart is an abort restart that
represents a jump to top level.".

So, my current implementation is (roughly):

abort <- function(...) {
 # handling messages etc

 # Fully abort the R evaluation and return to the top level
 invokeRestart("abort")
}

I've tested it in various setups with and without tryCatch(...,
condition=...) and so on and it appears to work.  Does anyone know if
I'm overlooking something or can I count on  invokeRestart("abort") to
always stop any currently evaluated R code?

Also, does anyone know how far back (in R versions) invokeRestart("abort") goes?

Thxs,

Henrik

______________________________________________
[hidden email] mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate
star

Re: Is invokeRestart("abort") unstoppable?

Martin Morgan
On 09/11/2012 04:19 PM, Henrik Bengtsson wrote:

> Hi,
>
> I'm trying to implement an abort() method that works just like stop()
> but does not signal the condition such that try() and tryCatch(...,
> condition=...) are, contrary to stop(), effectively non-working with
> abort() calls.
>
> In order to achieve this, I stumbled upon invokeRestart("abort"), cf.
> help("invokeRestart", package="base") that reads "Restarts are used
> for establishing recovery protocols. They can be established using
> withRestarts. One pre-established restart is an abort restart that
> represents a jump to top level.".
>
> So, my current implementation is (roughly):
>
> abort <- function(...) {
>   # handling messages etc
>
>   # Fully abort the R evaluation and return to the top level
>   invokeRestart("abort")
> }
>
> I've tested it in various setups with and without tryCatch(...,
> condition=...) and so on and it appears to work.  Does anyone know if
> I'm overlooking something or can I count on  invokeRestart("abort") to
> always stop any currently evaluated R code?

Not sure what 'currently evaluating R code' means, but

   f = function(x) {
       on.exit(cat("not dead yet\n"))
       invokeRestart("abort")
   }

 > f()
never say die

   g = function() {
       reg.finalizer(new.env(), function(...)
           cat("not dead yet\n"))
       invokeRestart("abort")
   }
 > g()
 > gc()
not dead yet
          used (Mb) gc trigger (Mb) max used (Mb)
Ncells 170841  9.2   47185920 2520   709729 38.0
Vcells 145992  1.2  268435456 2048  1023614  7.9

   h = function() {
       withRestarts(f(), abort=function(...) {
           cat("I'm sorry Henrik, I can't do that\n")
           TRUE
        })
   }

 > h()
never say die
I'm sorry Henrik, I can't do that
[1] TRUE

all evaluate code after invoking abort.

>
> Also, does anyone know how far back (in R versions) invokeRestart("abort") goes?

$ svn blame conditions.Rd

says that the line you quote is from r25527 (which is when tryCatch
appears to have been introduced), and

$ svn info -r25527
Path: man
URL: https://svn.r-project.org/R/trunk/src/library/base/man
Repository Root: https://svn.r-project.org/R
Repository UUID: 00db46b3-68df-0310-9c12-caf00c1e9a41
Revision: 25527
Node Kind: directory
Last Changed Author: luke
Last Changed Rev: 25527
Last Changed Date: 2003-07-31 12:35:18 -0700 (Thu, 31 Jul 2003)

>
> Thxs,
>
> Henrik
>
> ______________________________________________
> [hidden email] mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>


--
Computational Biology / Fred Hutchinson Cancer Research Center
1100 Fairview Ave. N.
PO Box 19024 Seattle, WA 98109

Location: Arnold Building M1 B861
Phone: (206) 667-2793

______________________________________________
[hidden email] mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate
star

Re: Is invokeRestart("abort") unstoppable?

Henrik Bengtsson-3
Thanks for you help Martin,

On Tue, Sep 11, 2012 at 8:22 PM, Martin Morgan <[hidden email]> wrote:

> On 09/11/2012 04:19 PM, Henrik Bengtsson wrote:
>>
>> Hi,
>>
>> I'm trying to implement an abort() method that works just like stop()
>> but does not signal the condition such that try() and tryCatch(...,
>> condition=...) are, contrary to stop(), effectively non-working with
>> abort() calls.
>>
>> In order to achieve this, I stumbled upon invokeRestart("abort"), cf.
>> help("invokeRestart", package="base") that reads "Restarts are used
>> for establishing recovery protocols. They can be established using
>> withRestarts. One pre-established restart is an abort restart that
>> represents a jump to top level.".
>>
>> So, my current implementation is (roughly):
>>
>> abort <- function(...) {
>>   # handling messages etc
>>
>>   # Fully abort the R evaluation and return to the top level
>>   invokeRestart("abort")
>> }
>>
>> I've tested it in various setups with and without tryCatch(...,
>> condition=...) and so on and it appears to work.  Does anyone know if
>> I'm overlooking something or can I count on  invokeRestart("abort") to
>> always stop any currently evaluated R code?
>
>
> Not sure what 'currently evaluating R code' means, but
>
>   f = function(x) {
>       on.exit(cat("never say die\n"))
>       invokeRestart("abort")
>   }
>
>> f()
> never say die

I forgot about on.exit(), though this is how I'd like abort() to
behave, i.e. abort() = stop() minus signalling.

>
>   g = function() {
>       reg.finalizer(new.env(), function(...)
>           cat("not dead yet\n"))
>       invokeRestart("abort")
>   }
>> g()
>> gc()
> not dead yet
>          used (Mb) gc trigger (Mb) max used (Mb)
> Ncells 170841  9.2   47185920 2520   709729 38.0
> Vcells 145992  1.2  268435456 2048  1023614  7.9

This one too.

>
>   h = function() {
>       withRestarts(f(), abort=function(...) {
>           cat("I'm sorry Henrik, I can't do that\n")
>           TRUE
>        })
>   }
>
>> h()
> never say die
> I'm sorry Henrik, I can't do that
> [1] TRUE
>
> all evaluate code after invoking abort.

This one I would never figure out/think of myself.  Although the abort
is caught here, at least the behavior of abort() is consistent with
stop() here too.  So for now, I'm (still) satisfied.

>
>
>>
>> Also, does anyone know how far back (in R versions) invokeRestart("abort")
>> goes?
>
>
> $ svn blame conditions.Rd
>
> says that the line you quote is from r25527 (which is when tryCatch appears
> to have been introduced), and
>
> $ svn info -r25527
> Path: man
> URL: https://svn.r-project.org/R/trunk/src/library/base/man
> Repository Root: https://svn.r-project.org/R
> Repository UUID: 00db46b3-68df-0310-9c12-caf00c1e9a41
> Revision: 25527
> Node Kind: directory
> Last Changed Author: luke
> Last Changed Rev: 25527
> Last Changed Date: 2003-07-31 12:35:18 -0700 (Thu, 31 Jul 2003)

Perfect.

/Henrik

>
>>
>> Thxs,
>>
>> Henrik
>>
>> ______________________________________________
>> [hidden email] mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>
>
>
> --
> Computational Biology / Fred Hutchinson Cancer Research Center
> 1100 Fairview Ave. N.
> PO Box 19024 Seattle, WA 98109
>
> Location: Arnold Building M1 B861
> Phone: (206) 667-2793

______________________________________________
[hidden email] mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
Loading...