From ggrothendieck at gmail.com  Tue Mar 14 15:20:41 2006
From: ggrothendieck at gmail.com (Gabor Grothendieck)
Date: Tue, 14 Mar 2006 09:20:41 -0500
Subject: [Rd] New simpleExit() condition (Was: Re: Can example() code
	stop the example without generating an error?)
In-Reply-To: <59d7961d0603140604k23255e04vdaaa0963a66653d5@mail.gmail.com>
References: <59d7961d0603140604k23255e04vdaaa0963a66653d5@mail.gmail.com>
Message-ID: <971536df0603140620y60769e0ep6b71faa2aa4abfc5@mail.gmail.com>

I would very much like to see such a feature too.

On 3/14/06, Henrik Bengtsson <hb at maths.lth.se> wrote:
> On 3/14/06, Uwe Ligges <ligges at statistik.uni-dortmund.de> wrote:
> > Henrik Bengtsson wrote:
> >
> > > Hi,
> > >
> > > does anyone know if it is possible to write example code (in Rd
> > > examples) such that one can stop the example without generating an
> > > error?  Example:
> > >
> > > code A
> > > if (cond)
> > >   niceStop()
> > > code B
> >
> >
> > What about
> >
> > code A
> > if(cond){
> >    code B
> > }
> >
> > But maybe I do not get your point.
>
> The purpose is to keep the code clean and I want to avoid nested if
> statements.  Further conditions down the stream would make the code
> quite ugly.  Pretty much for the same reason you use 'return()' and
> 'break'.
>
> A nicer and more general solution is to have a subclass "simpleExit"
> of "simpleCondition" and make source() catch such signals via
> tryCatch(..., simpleExit=function(se) {...}).  Here is a complete
> example:
>
> simpleExit <- function(...) {
>  cond <- simpleCondition(...)
>  class(cond) <- c("simpleExit", class(cond))
>  cond
> }
>
> exit <- function(...) {
>  invisible(signalCondition(simpleExit(...)))
> }
>
> evalWithExit <- function(...) {
>  tryCatch(..., simpleExit=function(cond) cond)
> }
>
> sourceWithExit <- function(...) {
>  evalWithExit(source(...))
> }
>
>
> Examples:
>
> > evalWithExit({cat("Hi\n");exit("Bye!");cat("there\n")}); cat("bye\n")
> Hi
> <simpleExit: Bye!>
> bye
>
> # Compare this...
> > code <- 'cat("Hi\n"); exit("Bye!"); cat("there\n")'
> > source(textConnection(code))
> Hi
> there
>
> # ...with this:
> > sourceWithExit(textConnection(code))
> Hi
> <simpleExit: Bye!>
>
> R-core, would this be a useful feature to add to source()?
>
> /Henrik
>
> > Uwe Ligges
> >
> >
> > > I know this sounds weird, but I would like some of my Rd examples to
> > > run if and only if another package is available or if a certain large
> > > Affymetrix data file is available.  One can put all of the example in
> > > a function and return from the function if the package is not
> > > available, but then all object assigned are lost. My best/cleanest
> > > solution right now is to use break in a dummy for loop. Examples:
> > >
> > > for (z in 1) {
> > >
> > > code A
> > > if (cond)
> > >   break
> > > code B
> > >
> > > }
> > >
> > > Other suggestions?  The solution must off course pass R CMD check.
> > >
> > > /Henrik
> > >
> > > PS. I know example() calls source(), but I'm not sure how R CMD check
> > > does it. DS.
> > >
> > > ______________________________________________
> > > R-devel at r-project.org mailing list
> > > https://stat.ethz.ch/mailman/listinfo/r-devel
> >
> > ______________________________________________
> > R-devel at r-project.org mailing list
> > https://stat.ethz.ch/mailman/listinfo/r-devel
> >
> >
>
>
> --
> Henrik Bengtsson
> Mobile: +46 708 909208 (+1h UTC)
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>



[Rd] New simpleExit() condition (Was: Re: Can example() code stop the example without generating an error?)
Gabor Grothendieck