Re: [Rd] RFC: Proposal to make NROW() and NCOL() slightly more general

From: Martin Maechler <maechler_at_stat.math.ethz.ch>
Date: Mon, 06 Feb 2012 15:35:36 +0100

> On Sat, Feb 4, 2012 at 10:38 AM, Martin Maechler
> <maechler_at_stat.math.ethz.ch> wrote:
> > The help has
> >
> >> Description:
> >
> >>   'nrow' and 'ncol' return the number of rows or columns present in 'x'.
> >>   'NCOL' and 'NROW' do the same treating a vector as 1-column matrix.
> >
> > and
> >
> >>   x: a vector, array or data frame
> >
> > I'm proposing to extend these two convenience functions
> > to also work ``correctly'' for generalized versions of matrices.
> >
> >
> > The current implementation :
> >
> > NROW <- function(x) if(is.array(x)||is.data.frame(x)) nrow(x) else length(x)
> > NCOL <- function(x) if(is.array(x) && length(dim(x)) > 1L || is.data.frame(x)) ncol(x) else 1L
> >
> > only treats something as matrix when  is.array(.) is true,
> > which is not the case, e.g., for multiprecision matrices from
> > package 'gmp' or for matrices from packages SparseM, Matrix or similar.
> >
> > Of course, all these packages could write methods for NROW, NCOL
> > for their specific matrix class, but given that the current
> > definition is so simple,
> > I'd find it an unnecessary complication.
> >
> > Rather I propose the following new version
> >
> > NROW <- function(x) if(length(dim(x)) || is.data.frame(x)) nrow(x) else length(x)
> > NCOL <- function(x) if(length(dim(x)) > 1L || is.data.frame(x)) ncol(x) else 1L

> That makes me wonder about:

> DIM <- function(x) if (length(dim(x)) > 1L) dim(x) else c(length(x), 1L)

> or maybe more efficiently:

> DIM <- function(x) {
> d <- dim(x)
> if (length(d) > 1L) dim(x) else c(length(x), 1L)
> }

> given that dim() is not always trivial to compute (e.g. for data
> frames it can be rather slow if you're doing it for hundreds of data
> frames)

> then NROW and NCOL could be exact equivalents to nrow and ncol.

> Hadley

Thank you, Hadley.
Indeed, your suggestion seems to make sense {as far as it makes sense to have such simple functions to  exist in base at all, but as we already have NROW and NCOL ..}

So, I propose to adopt Hadley's DIM() proposal, modified to

DIM <- function(x) if(length(d <- dim(x))) d else c(length(x), 1L)

and wait a day or so (or longer for reasons of vacation!) before committing it, so the public can raise opinions.

Martin



R-devel_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel Received on Mon 06 Feb 2012 - 14:38:57 GMT

This quarter's messages: by month, or sorted: [ by date ] [ by thread ] [ by subject ] [ by author ]

All messages

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Tue 07 Feb 2012 - 18:30:14 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-devel. Please read the posting guide before posting to the list.

list of date sections of archive