[R] `head` doesn't show all columns for an empty data.frame
Duncan Murdoch
murdoch.duncan at gmail.com
Thu Sep 22 16:24:45 CEST 2016
On 22/09/2016 4:45 AM, Colin Phillips wrote:
> I'm sure I'm doing something wrong, but I'm seeing strange behaviour using the `head` and `tail` functions on an empty data.frame.
>
> To reproduce:
> # create an empty data frame. I actually read an empty table from Excel using `readWorkbook` from package `openxlsx`
> test <- structure(list(Code = NULL, Name = NULL, Address = NULL, Sun.Hrs = NULL,
> Mon.Hrs = NULL), .Names = c("Code", "Name", "Address", "Sun.Hrs",
> "Mon.Hrs"), class = "data.frame", row.names = integer(0))
That's not a valid dataframe, it's just labelled as one. If you tried
to create it with data.frame(), you'd get something different.
> test <- data.frame(Code = NULL, Name = NULL, Address = NULL, Sun.Hrs
= NULL,
+ Mon.Hrs = NULL)
> test
data frame with 0 columns and 0 rows
You can create a zero-row dataframe as long as you put 0-length vectors
in as columns. NULL is not a vector.
> test <- data.frame(Code = numeric(0), Name = numeric(0), Address =
numeric(0), Sun.Hrs = numeric(0),
+ Mon.Hrs = numeric(0))
> test
[1] Code Name Address Sun.Hrs Mon.Hrs
<0 rows> (or 0-length row.names)
If you do that, head() works:
> head(test)
[1] Code Name Address Sun.Hrs Mon.Hrs
<0 rows> (or 0-length row.names)
So this is a bug in openxlsx. It's also a well-known limitation of the
S3 object system: you can easily create things that are labelled with a
certain class, but aren't valid objects of that class.
Duncan Murdoch
More information about the R-help
mailing list