[R] Problem with +(POSIXt, difftime) dispatching -- WAS: How to create sequence of constant time interval
Stavros Macrakis
macrakis at alum.mit.edu
Tue Feb 17 03:17:26 CET 2009
There seems to be a problem in the way `+` is dispatched for
POSIXt/difftime (R 2.8.0 Windows).
With the following definitions:
t0 <- as.POSIXct('2009-01-01 00:00')
halfhour.mins <- as.difftime(30,units='mins')
I would have thought that the straightforward answer to Suresh's
question would be something like
t0 + halfhour.mins * (0:47)
And indeed, if we call the class-specific function (which explicitly
handles the POSIXt + difftime case), we sensibly get:
`+.POSIXt`(t0, halfhour.mins * (0:47) )
"2009-01-01 00:30:00 EST" ... "2009-01-01 23:30:00 EST"
But if we use the generic function, it yields an incorrect result
(wrong class, wrong values) as well as a Warning:
t0 + halfhour.mins * (0:47)
Time differences in mins
1230786000 1230786030 ... 1230787410
Warning message:
Incompatible methods ("+.POSIXt", "Ops.difftime") for "+"
And even more peculiarly, if the second argument is of length 1, the
result has a different class (though the same warning):
t0 + halfhour.mins
"2009-01-01 00:00:30 EST" <<< POSIXct type correct,
but added seconds
Warning message:
Incompatible methods ("+.POSIXt", "Ops.difftime") for "+"
This does not happen with the class-specific function:
`+.POSIXt`(t0, halfhour.mins)
"2009-01-01 00:30:00 EST"
I wondered if this sort of problem was inherent to the S3 framework,
but it doesn't seem to be:
plus <- function(e1,e2) UseMethod("+")
`+.default` <- `+`
plus(t0,halfhour.mins)
"2009-01-01 00:30:00 EST"
plus(t0,halfhour.mins*c(0,1))
"2009-01-01 00:00:00 EST" "2009-01-01 00:30:00 EST"
And the system already defines `+.POSIXt` and `+.Date`. So the problem
seems to be within the primitive `+`.
-s
PS There are other peculiarities in the handling of difftime -- see my
email of Feb 6, 2009 6:17 PM ("Operations on difftime (abs, /, c)") --
which could easily be revised. Is there some reason they shouldn't be?
More information about the R-help
mailing list