# [R] Correct way to test for exact dimensions of matrix or array

Martin Maechler maechler at stat.math.ethz.ch
Tue Jan 10 16:13:30 CET 2006

```>>>>> "Gregory" == Gregory Jefferis <gsxej2 at cam.ac.uk>
>>>>>     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!)

```