Skip to content

`as.data.frame.matrix()` can produce a data frame without a `names` attribute

3 messages · Davis Vaughan, Martin Maechler

#
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
#
> 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
---
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
#
>> 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
Commited to R's (R-devel) sources in svn rev 86169   .. to
become R 4.4.0 soonish.

Martin