|
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 |
|
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 |
|
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 |
| Powered by Nabble | Edit this page |
