[Rd] collapsing list of NULLs dimnames into a NULL

Hervé Pagès hpages at fredhutch.org
Fri Jun 10 22:26:09 CEST 2016


Here are two different ways to create a 0 x 0 logical matrix:

   m1 <- matrix(nrow=0, ncol=0)
   # <0 x 0 matrix>

   m2 <- as.matrix(data.frame())
   # <0 x 0 matrix>


   identical(m1, m2)
   # [1] FALSE

That's because of their dimnames:

   # NULL

   # [[1]]
   # NULL
   # [[2]]
   # NULL

More generally this can be observed with 0-col matrices:

   m1 <- matrix(nrow=5, ncol=0)
   m2 <- as.matrix(data.frame(stuff=11:15)[0])
   identical(m1, m2)  # FALSE

The culprit is this line in as.matrix.data.frame():

   dimnames(X) <- list(dn[[1L]], unlist(collabs, use.names = FALSE))

Shouldn't as.matrix.data.frame() collapse the list of NULLs into a NULL
before setting the dimnames?

Alternatively, maybe a more general solution could be to have the
dimnames() setter take care of this. There seems to be a lot of
code around that is potentially setting a list of NULLs as the dimnames
of an object, so having dimnames<- do the collapse would fix the problem
in one place once for all and avoid a lot of repeated code.

Finally, having this functionality available at the C level would be
great. Would basically be a wrapper to

   Rf_setAttrib(x, R_DimNamesSymbol, dimnames)

that takes care of the collapse. The SET_DIMNAMES macro could be
redefined to call that wrapper instead...


Hervé Pagès

Program in Computational Biology
Division of Public Health Sciences
Fred Hutchinson Cancer Research Center
1100 Fairview Ave. N, M1-B514
P.O. Box 19024
Seattle, WA 98109-1024

E-mail: hpages at fredhutch.org
Phone:  (206) 667-5791
Fax:    (206) 667-1319

More information about the R-devel mailing list