Liaw, Andy
2005-Apr-13 22:22 UTC
[R] terminate R program when trying to access out-of-bounds a rray element?
As Bert said, redefining functions like "[" is surely inadvisable, because of possibility of breaking codes that depend on the intended behavior. This is a language _feature_. If the problem is indexing beyond array extent, just check for it: Are any values that are going to be used for indexing larger than the length of the object? E.g., if (any(idx > length(x))) stop("index out of bound") result <- x[i] If this is still too much work for you, Perhaps R is not for you... Andy> From: Rich FitzJohn > > 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 > > >
Seemingly Similar Threads
- S4 group methods don't dispatch for "Summary"?
- terminate R program when trying to access out-of-bounds array element?
- Infinite recursion in S3 methods crashes R on windows (related to PR#8203?)
- summing columns using partial labels
- Suggestions for manipulating formula objects