[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