>>>>> "Gregory" == Gregory Jefferis <[EMAIL PROTECTED]> >>>>> on Tue, 10 Jan 2006 14:47:43 +0000 writes:
Gregory> Dear R Users, Gregory> I want to test the dimensions of an incoming Gregory> vector, matrix or array safely Gregory> and succinctly. Specifically I want to check if Gregory> the unknown object has exactly 2 dimensions with a Gregory> specified number of rows and columns. Gregory> I thought that the following would work: >> obj=matrix(1,nrow=3,ncol=5) >> identical( dim( obj) , c(3,5) ) Gregory> [1] FALSE Gregory> But it doesn't because c(3,5) is numeric and the dims are integer. I Gregory> therefore ended up doing something like: >> identical( dim( obj) , as.integer(c(3,5))) Gregory> OR >> isTRUE(all( dim( obj) == c(3,5) )) the last one is almost perfect if you leave a way the superfluous isTRUE(..). But, you say that it's part of your function checking it's arguments. In that case, I'd recommend if(length(d <- dim(obj)) != 2) stop("'d' must be matrix-like") if(!all(d == c(3,5))) stop("the matrix must be 3 x 5") which also provides for nice error messages in case of error. A more concise form with less nice error messages is stopifnot(length(d <- dim(obj)) == 2, d == c(3,50)) ## you can leave away all(.) for things in stopifnot(.) Gregory> Neither of which feel quite right. Is there a 'correct' way to do this? Gregory> Many thanks, You're welcome, Martin Maechler, ETH Zurich Gregory> Greg Jefferis. Gregory> PS Thinking about it, the second form is (doubly) wrong because: >> obj=array(1,dim=c(3,5,3,5)) >> isTRUE(all( dim( obj) == c(3,5) )) Gregory> [1] TRUE Gregory> OR >> obj=numeric(10) >> isTRUE(all( dim( obj) == c(3,5) )) Gregory> [1] TRUE Gregory> (neither of which are equalities that I am happy with!) ______________________________________________ R-help@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