From mtmorgan at fhcrc.org  Wed Sep 12 05:22:24 2012
From: mtmorgan at fhcrc.org (Martin Morgan)
Date: Tue, 11 Sep 2012 20:22:24 -0700
Subject: [Rd] Is invokeRestart("abort") unstoppable?
In-Reply-To: <CAFDcVCQCEUGuWcD2nqpzAxMwsao=QT=nkhzG5OZop5hostjsKw@mail.gmail.com>
References: <CAFDcVCQCEUGuWcD2nqpzAxMwsao=QT=nkhzG5OZop5hostjsKw@mail.gmail.com>
Message-ID: <504FFFF0.4080602@fhcrc.org>

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
>
> ______________________________________________
> R-devel at r-project.org 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



[Rd] Is invokeRestart("abort") unstoppable?
Martin Morgan