Davis Vaughan
2024-Mar-21 19:10 UTC
[Rd] `as.data.frame.matrix()` can produce a data frame without a `names` attribute
Hi all, I recently learned that it is possible for `as.data.frame.matrix()` to produce a data frame with 0 columns that is also entirely missing a `names` attribute, and I think this is a bug: ``` # No `names`, weird! attributes(as.data.frame(matrix(nrow = 0, ncol = 0))) #> $class #> [1] "data.frame" #> #> $row.names #> integer(0) # This is what I expected attributes(data.frame()) #> $names #> character(0) #> #> $row.names #> integer(0) #> #> $class #> [1] "data.frame" ``` In my experience, 0 column data frames should probably still have a `names` attribute, and it should be set to `character()`. Some evidence to support my theory is that OOB subsetting doesn't give the intended error with this weird data frame: ``` # Good OOB error df <- data.frame() df[1] #> Error in `[.data.frame`(df, 1): undefined columns selected # This is weird! df <- as.data.frame(matrix(nrow = 0, ncol = 0)) df[1] #> NULL #> <0 rows> (or 0-length row.names) ``` The one exception to requiring a `names` attribute that I can think of is `as.data.frame(optional = TRUE)`, mostly for internal use by `data.frame()` on each of the columns, but that doesn't seem to apply here. Thanks, Davis Vaughan
Martin Maechler
2024-Mar-22 10:17 UTC
[Rd] `as.data.frame.matrix()` can produce a data frame without a `names` attribute
>>>>> Davis Vaughan via R-devel >>>>> on Thu, 21 Mar 2024 15:10:29 -0400 writes:> Hi all, > I recently learned that it is possible for > `as.data.frame.matrix()` to produce a data frame with 0 > columns that is also entirely missing a `names` attribute, > and I think this is a bug: > ``` # No `names`, weird! > attributes(as.data.frame(matrix(nrow = 0, ncol = 0))) #> > $class #> [1] "data.frame" > #> > #> $row.names #> integer(0) > # This is what I expected attributes(data.frame()) #> > $names #> character(0) > #> > #> $row.names #> integer(0) > #> > #> $class #> [1] "data.frame" ``` > In my experience, 0 column data frames should probably > still have a `names` attribute, and it should be set to > `character()`. I agree. A (very nice IMO) patch I'm currently testing is 317c317 < names(value) <- collabs ---> names(value) <- collabs %||% character()Martin > Some evidence to support my theory is that > OOB subsetting doesn't give the intended error with this > weird data frame: > ``` # Good OOB error df <- data.frame() df[1] #> Error in > `[.data.frame`(df, 1): undefined columns selected > # This is weird! df <- as.data.frame(matrix(nrow = 0, > ncol = 0)) df[1] #> NULL #> <0 rows> (or 0-length > row.names) ``` > The one exception to requiring a `names` attribute that I > can think of is `as.data.frame(optional = TRUE)`, mostly > for internal use by `data.frame()` on each of the columns, > but that doesn't seem to apply here. > Thanks, Davis Vaughan > ______________________________________________ > R-devel at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel