[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