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

Tony Plate tplate at acm.org
Tue Jan 10 20:55:52 CET 2006


There's a gotcha in using identical() to compare dimensions -- it also 
compares names, e.g.:

 > x <- array(1:14, dim=c(rows=3,cols=5))
 > dim(x)
rows cols
    3    5
 > identical(dim(x)+0, c(3,5))
[1] FALSE
 > identical(as.numeric(dim(x)+0), c(3,5))
[1] TRUE
 >

Gabor Grothendieck wrote:
> If its just succint you are after then this is slightly
> shorter:
> 
>    identical(dim(x)+0, c(3,5))
> 
> 
> On 1/10/06, Gregory Jefferis <gsxej2 at cam.ac.uk> wrote:
> 
>>Thanks for suggestions.  This is a simple question in principle, but there
>>seem to be some wrinkles - I am always having to think quite carefully about
>>how to test for equality in R.  I should also have said that I would like
>>the check to be efficient as well safe and succinct.
>>
>>One suggestion was:
>>
>>   isTRUE(all.equal(dim(obj), c(3, 5)))
>>
>>But that is not so efficient because all.equal does lots of work esp if it
>>the objects are not equal.
>>
>>Another suggestion was:
>>
>>   all( dim( obj) == c(3,5) )
>>
>>But that is not safe eg because dim(vector(10)) is NULL and
>>all(NULL==c(3,5)) is actually TRUE (to my initial surprise) so vectors would
>>pass through the net.
>>
>>So, so far the only way that is efficient, safe and succinct is:
>>
>>   identical( dim( obj) , as.integer(c(3,5)))
>>
>>Martin Maechler pointed out that at the beginning of a function you might
>>want to break down the test into something less succinct, that printed more
>>specific error messages - a good suggestion for a top level function that is
>>supposed to be user friendly.
>>
>>Any other suggestions?  Many thanks,
>>
>>Greg Jefferis.
>>
>>On 10/1/06 15:13, "Martin Maechler" <maechler at stat.math.ethz.ch> wrote:
>>
>>
>>>>>>>>"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!)
>>>
>>
>>--
>>Gregory Jefferis, PhD                               and:
>>Research Fellow
>>Department of Zoology                               St John's College
>>University of Cambridge                             Cambridge
>>Downing Street                                      CB2 1TP
>>Cambridge, CB2 3EJ
>>United Kingdom
>>
>>Tel: +44 (0)1223 336683                             +44 (0)1223 339899
>>Fax: +44 (0)1223 336676                             +44 (0)1223 337720
>>
>>gsxej2 at cam.ac.uk
>>
>>______________________________________________
>>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