[R] terminate R program when trying to access out-of-bounds array element?
Tony Plate
tplate at blackmesacapital.com
Thu Apr 14 01:24:25 CEST 2005
Oops.
The message in the 'stop' should be something more like "numeric index
out of range".
-- Tony Plate
Tony Plate wrote:
> One way could be to make a special class with an indexing method that
> checks for out-of-bounds numeric indices. Here's an example for vectors:
>
> > setOldClass(c("oobcvec"))
> > x <- 1:3
> > class(x) <- "oobcvec"
> > x
> [1] 1 2 3
> attr(,"class")
> [1] "oobcvec"
> > "[.oobcvec" <- function(x, ..., drop=T) {
> + if (!missing(..1) && is.numeric(..1) && any(is.na(..1) | ..1 < 1 |
> ..1 > length(x)))
> + stop("numeric vector out of range")
> + NextMethod("[")
> + }
> > x[2:3]
> [1] 2 3
> > x[2:4]
> Error in "[.oobcvec"(x, 2:4) : numeric vector out of range
> >
>
> Then, for vectors for which you want out-of-bounds checks done when they
> indexed, set the class to "oobcvec". This should work for simple
> vectors (I checked, and it works if the vectors have names).
>
> If you want this write a method like this for indexing matrices, you can
> use ..1 and ..2 to refer to the i and j indices. If you want to also be
> able to check for missing character indices, you'll just need to add
> more code. Note that the above example disallows 0 and negative
> indices, which may or may not be what you want.
>
> If you're extensively using other classes that you've defined, and you
> want out-of-bounds checking for them, then you need to integrate the
> checks into the subsetting methods for those classes -- you can't just
> use the above approach.
>
> hope this helps,
>
> Tony Plate
>
>
> Vivek Rao 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
>>
>
> ______________________________________________
> 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