R-beta: why restart()

Simon Fear (fear@scmp.scm.liv.ac.uk)
Thu, 23 Oct 1997 16:35:44 +0100


Date: Thu, 23 Oct 1997 16:35:44 +0100
From: fear@scmp.scm.liv.ac.uk (Simon Fear)
Message-Id: <199710231535.QAA16161@scmp.scm.liverpool.ac.uk>
To: plummer@iarc.fr
Subject: R-beta: why restart()

Content-MD5: Ar071lgMlvAl63JhANaW7w==
Sender: owner-r-help@stat.math.ethz.ch
Precedence: bulk

Martyn, you write

> I don't think restart() is necessary  - it just seems like an invitation to
> bad programming to me. 

It's needed when comparing, say, the time to convergence (if at all) of various 
iterative processes, for each of a few hundred simulated values. For example one 
wants basically

function(data){
	summary<-rep(NA,1000)
	for(i in 1:1000){
		results1<-prog1(data[i])
		results2<-prog2(data[i])
		.
		.
		.
		summary[i] <- f(results1,results2,...)
	}
	summary
}

where prog1, say, can sometimes fail fatally, for certain data values. The 
*object of the exercise* is to find out what values cause program i to crash but 
program j to run ok.

One can use immediate assigns (in Splus - haven't tried in R cos this study 
needs a restart() function!) so that at least results pre-crash are stored. But 
I want to study cases where 90% of all the cases fail fatally; it would never 
get off the ground.

I accept that if you know what will cause the fatal fail you can program in a 
test for it --- sometimes. What about this one: likely fatal error due to 
solve(mat,x) having nonsingular matrix. Yes, yes, check there aren't any zeros 
on the diagonal of the SVD ... but mine are 512x512 matrices.

It isn't efficient programming to completely re-write solve (or indeed to 
re-write any built-in) with it's built-in fatal return changed to an error 
return, and it isn't efficient to run solve if you're going to do an explicit 
SVD in the first place. It *is* efficient to call try(solve()) where try is

function(expr, first = T)
{
# return either the proper answer to expr or NA (length 1), 
# with printed error message. See splus_break for a version
# that returns error message as structure.
#
# DO NOT USE THE 'first' ARGUMENT
        restart(first)
        if(first) {
                first <- F
                expr
        }
        else {
# get_last_message doesn't always get the error message ...
                print(paste("ERROR:", .C("get_last_message",
                        "")[[1]]))
                NA
        }
}

Thanks to someone whose name I have lost for posting this one to s-news.

Then you also get try(parse()).

Actually, I agree that self-written functions shouldn't need try(), you should 
build in error handling. It's the built-in functions that make me suggest 
restart() is `necessary'. The built-ins have error handling, but not under my 
control.

Simon Fear
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-help-request@stat.math.ethz.ch
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=