> On Sat, Feb 4, 2012 at 10:38 AM, Martin Maechler > <maech...@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@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel