| balancePOSIXlt {base} | R Documentation |
Balancing “Ragged” and Out-of-range POSIXlt Date-Times
Description
Utilities to ‘balance’ objects of class "POSIXlt".
unCfillPOSIXlt(x) is a fast primitive version of
balancePOSIXlt(x, fill.only=TRUE, classed=FALSE) or equivalently,
unclass(balancePOSIXlt(x, fill.only=TRUE)) from where it is named.
Usage
balancePOSIXlt(x, fill.only = FALSE, classed = TRUE)
unCfillPOSIXlt(x)
Arguments
x |
an R object inheriting from |
fill.only |
a |
classed |
a |
“Ragged” and Out-of-range vs “Balanced” POSIXlt
Note that "POSIXlt" objects x may have their (9 to 11)
list components of different lengths, by simply
recycling them to full length. Prior to R 4.3.0, this has worked in
printing, formatting, and conversion to "POSIXct", but often
not for length(), conversion to "Date" or indexing,
i.e., subsetting, [, or subassigning, [<-.
Relatedly, components sec, min, hour, mday
and mon could have been out of their designated range (say, 0–23
for hours) and still work correctly, e.g. in conversions and printing.
This is supported as well, since R 4.3.0, at least when the values are
not extreme.
Function balancePOSIXlt(x) will now return a version of the
"POSIXlt" object x which by default is balanced in both ways:
All the internal list components are of full length, and their values are
inside their ranges as specified in as.POSIXlt's
‘Details on POSIXlt’.
Setting fill.only = TRUE will only recycle the list components
to full length, but not check them at all. This is particularly faster
when all components of x are already of full length.
Experimentally, balancePOSIXlt() and other functions returning
POSIXlt objects now set a logical attribute
"balanced" with NA meaning “filled-in”, i.e.,
not “ragged” and TRUE means (fully) balanced.
See Also
For more details about many aspects of valid POSIXlt objects, notably
their internal list components, see ‘DateTimeClasses’, e.g.,
as.POSIXlt, notably the section ‘Details on POSIXlt’.
Examples
## FIXME: this should also work for regular (non-UTC) time zones.
TZ <-"UTC"
# Could be
# d1 <- as.POSIXlt("2000-01-02 3:45", tz = TZ)
# on systems (almost all) which have tm_zone.
oldTZ <- Sys.getenv('TZ', unset = "unset")
Sys.setenv(TZ = "UTC")
d1 <- as.POSIXlt("2000-01-02 3:45")
d1$min <- d1$min + (0:16)*20L
(f1 <- format(d1))
str(unclass(d1)) # only $min is of length > 1
df <- balancePOSIXlt(d1, fill.only = TRUE) # a "POSIXlt" object
str(unclass(df)) # all of length 17; 'min' unchanged
db <- balancePOSIXlt(d1, classed = FALSE) # a list
stopifnot(identical(
unCfillPOSIXlt(d1),
balancePOSIXlt(d1, fill.only = TRUE, classed = FALSE)))
str(db) # of length 17 *and* in range
if(oldTZ == "unset") Sys.unsetenv('TZ') else Sys.setenv(TZ = oldTZ)