[R] terminate R program when trying to access out-of-bounds arrayelement?

Berton Gunter gunter.berton at gene.com
Thu Apr 14 00:03:47 CEST 2005


WHOA!

Do not redefine R functions (especially "[" !) in this way! That's what R
classes and methods (either S3 or S4) are for. Same applies to print
methods. See the appropriate sections of the R language definition and the
book S PROGRAMMING by V&R.

Please do not offer "advice" of this sort if you are not knowledgeable about
R/S Programming, as it might be taken seriously.

-- Bert Gunter
Genentech Non-Clinical Statistics
South San Francisco, CA
 
"The business of the statistician is to catalyze the scientific learning
process."  - George E. P. Box
 
 

> -----Original Message-----
> From: r-help-bounces at stat.math.ethz.ch 
> [mailto:r-help-bounces at stat.math.ethz.ch] On Behalf Of Rich FitzJohn
> Sent: Wednesday, April 13, 2005 2:51 PM
> To: Vivek Rao
> Cc: r-help at stat.math.ethz.ch
> Subject: Re: [R] terminate R program when trying to access 
> out-of-bounds arrayelement?
> 
> Hi,
> 
> You could try redefining "[", so that if any element subsetted
> returned an NA, it would throw an error, e.g.: 
> (Warning: Largely untested! - this will almost certainly cause
> problems in other classes that use [ to subset.  Possibly defining
> this as "[.default" would be better...)
> 
> "[" <- function(x, ...) {
>   res <- (base::"[")(x, ...)
>   if ( any(is.na(res)) )
>     stop("An element was NA in a subset")
>   res
> }
> 
> > x <- 1:5
> > x[4]
> [1] 4
> > x[7]
> Error in x[7] : An element was NA in a subset
> 
> However, you'll probably find this is a little over-zealous, e.g.:
> > y <- c(1:3, NA, 4)
> > y[5]
> [1] 4
> > y[4]
> Error in y[4] : An element was NA in a subset
> 
> If you just want to check for an NA at printing, defining a function
> like this might be more appropriate:
> print.or.stop <- function(x) {
>   if ( any(is.na(x)) )
>     stop("An element was NA in a subset")
>   print(x)
> }
> 
> You could write a more complicated "[" function that does a bunch of
> testing, to see if the element extracted is going to be out of the
> extent of the vector (rather than a "genuine" NA), but since there are
> a number of ways elements can be extracted from vectors (numeric,
> logical and character indices can all be used to index vectors, and
> these have recycling rules, etc), this is probably much more work than
> a few checks in your code where an NA would actually indicate an
> error.
> 
> Cheers,
> Rich
> 
> On 4/14/05, Vivek Rao <rvivekrao at yahoo.com> wrote:
> > I want R to stop running a script (after printing an
> > error message) when an array subscript larger than the
> > length of the array is used, for example
> > 
> > x = c(1)
> > print(x[2])
> > 
> > rather than printing NA, since trying to access such
> > an element may indicate an error in my program. Is
> > there a way to get this behavior in R? Explicit
> > testing with the is.na() function everywhere does not
> > seem like a good solution. Thanks.
> > 
> > ______________________________________________
> > R-help at stat.math.ethz.ch mailing list
> > https://stat.ethz.ch/mailman/listinfo/r-help
> > PLEASE do read the posting guide! 
> http://www.R-project.org/posting-guide.html
> > 
> 
> 
> -- 
> Rich FitzJohn
> rich.fitzjohn <at> gmail.com   |    
> http://homepages.paradise.net.nz/richa183
>                       You are in a maze of twisty little 
> functions, all alike
> 
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide! 
> http://www.R-project.org/posting-guide.html
>




More information about the R-help mailing list