Why is Date is being returned as type 'double'?

Dates are internally represented as double, as you can see in the following example:

> typeof(as.Date("09/12/16", "%m/%d/%y"))
[1] "double"

it is still marked a class Date, as in

> class(as.Date("09/12/16", "%m/%d/%y"))
[1] "Date"

and because it is a double, you can do computations with it. But because it is of class Date, these computations lead to Dates:

> as.Date("09/12/16", "%m/%d/%y") + 1
[1] "2016-09-13"
> as.Date("09/12/16", "%m/%d/%y") + 31
[1] "2016-10-13"

EDIT I have asked for c() and cbind(), because they can be assciated with some strange behaviour. See the following example, where switching the order within c changes not the type but the class of the result:

> c(as.Date("09/12/16", "%m/%d/%y"), 1)
[1] "2016-09-12" "1970-01-02"
> c(1, as.Date("09/12/16", "%m/%d/%y"))
[1]     1 17056

> class(c(as.Date("09/12/16", "%m/%d/%y"), 1))
[1] "Date"
> class(c(1, as.Date("09/12/16", "%m/%d/%y")))
[1] "numeric"

EDIT 2 - c() and cbind force objects to be of one type. The first edit shows an anomaly of coercion, but generally, the vector must be of one shared type. cbind shares this behavior because it coerces to matrix, which in turn coerces to a single type.

For more help on typeof and class see this link


This is as expected. You used typeof(); you probably should used class():

R> Sys.Date()
[1] "2016-09-12"
R> typeof(Sys.Date())       # this more or less gives you how it is stored
[1] "double"
R> class(Sys.Date())        # where as this gives you _behaviour_
[1] "Date"
R> 

Minor advertisement: I have a new package anytime, currently in incoming at CRAN, which deals with this as it converts "anything" to POSIXct (via anytime()) or Date (via anydate().

E.g.:

R> anydate("12/30/2014")             # no format needed
[1] "2014-12-30"
R> anydate(as.factor("12/30/2014"))  # converts from factor too
[1] "2014-12-30"
R>