[Rd] rownames() problem with 0-extent arrays (PR#9136)

ripley at stats.ox.ac.uk ripley at stats.ox.ac.uk
Wed Aug 16 14:46:06 CEST 2006


The bug here comes from code assuming that

paste("row", numeric(0), sep="")

is of length 0. See ?paste.

Fixed for 2.4.0.

On Fri, 11 Aug 2006, richard_raubertas at merck.com wrote:

> [R 2.3.1 on Windows XP]
> 
> Hello,
> The 'do.NULL=FALSE' option of 'rownames' and 'colnames' does not 
> work as documented when the array has a 0-extent dimension:
> 
> tmp <- matrix(1:15, ncol=3, dimnames=list(letters[1:5], LETTERS[1:3]))
> rownames(tmp)  # Fine
> rownames(tmp[0,,drop=FALSE])   #  NULL (okay, but see question below)
> rownames(tmp[0,,drop=FALSE], do.NULL=FALSE)   #  "row"
> 
> The last line returns a character vector of length 1, "row", rather 
> than character(0) as implied by the second paragraph of the details 
> section of ?rownames:
> 
>      "If 'do.NULL' is 'FALSE', a character vector (of length 'NROW(x)'
>      or 'NCOL(x)') is returned in any case, prepending 'prefix' to
>      simple numbers, if there are no dimnames or the corresponding
>      component of the dimnames is 'NULL'."
> 
> ----------
> 
> A separate but related question (not a bug) has to do with the handling
> of dimnames for 0-extent arrays.  If an array starts out with non-NULL
> dimnames and is subscripted down to have 0-extent, the corresponding 
> component is set to NULL, rather than character(0):
> 
> dimnames(tmp[0,,drop=FALSE])   # first component is NULL
> 
> Why is that?  Note that this is different from how data frames are 
> handled:
> 
> tmp.df <- data.frame(tmp)
> dimnames(tmp.df[0,])  # first component is character(0)
> 
> The description in ?dimnames seems to allow character(0) components 
> of dimnames, 
> 
>      "The dimnames of a matrix or array can be 'NULL' or a list of the
>      same length as 'dim(x)'.  If a list, its components are either
>      'NULL' or a character vector the length of the appropriate
>      dimension of 'x'."
> 
> yet the implementation seems to resist them:
> 
> tmp2 <- tmp[0,,drop=FALSE]
> dimnames(tmp2) <- list(character(0), LETTERS[1:3])
> dimnames(tmp2)  #  still NULL
> 
> So my question is whether it would be reasonable to change 'dimnames'
> and/or "dimnames<-" to use (or at least allow) character(0) rather than 
> NULL for array dimensions of 0 extent.
> 
> Rich Raubertas
> Merck & Co.
> 
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
> 

-- 
Brian D. Ripley,                  ripley at stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595



More information about the R-devel mailing list