I can reproduce this now on my personal Mac:
x <- as.POSIXlt(as.POSIXct("2013-01-31", tz = "America/Chicago"))
x <- as.POSIXlt(as.POSIXct("2013-01-31", tz = "America/Chicago"))
Sys.setenv(TZ = "America/New_York")
x <- as.POSIXlt(as.POSIXct("2013-01-31", tz = "America/Chicago"))
x[1] <- NA
#> Error in x[[n]][i] <- value[[n]] : replacement has length zero
#> [1] "2013-01-31 CST"
```
Here are `sessionInfo()` and `Sys.getenv("TZ")` outputs for 3 GitHub
Actions platforms where the bug exists (note they all set `TZ = "UTC"`!):
R version 4.2.1 (2022-06-23)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 18.04.6 LTS
BLAS: /usr/lib/x86_64-linux-gnu/openblas/libblas.so.3
LAPACK: /usr/lib/x86_64-linux-gnu/libopenblasp-r0.2.20.so
[1] LC_CTYPE=C.UTF-8 LC_NUMERIC=C LC_TIME=C.UTF-8
[4] LC_COLLATE=C.UTF-8 LC_MONETARY=C.UTF-8 LC_MESSAGES=C.UTF-8
[7] LC_PAPER=C.UTF-8 LC_NAME=C LC_ADDRESS=C
[10] LC_TELEPHONE=C LC_MEASUREMENT=C.UTF-8 LC_IDENTIFICATION=C
[1] stats graphics grDevices utils datasets methods base
loaded via a namespace (and not attached):
R version 4.2.1 (2022-06-23)
Platform: x86_64-apple-darwin17.0 (64-bit)
Running under: macOS Big Sur ... 10.16
BLAS:
/Library/Frameworks/R.framework/Versions/4.2/Resources/lib/libRblas.0.dylib
LAPACK:
/Library/Frameworks/R.framework/Versions/4.2/Resources/lib/libRlapack.dylib
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
[1] stats graphics grDevices utils datasets methods base
loaded via a namespace (and not attached):
Windows:
This is the best I can get you, sorry (remote worker issues), but note that
it does also say `tz UTC` like the others.
```
version R version 4.2.1 (2022-06-23 ucrt)
os Windows Server x64 (build 20348)
system x86_64, mingw32
ui RTerm
language (EN)
collate English_United States.utf8
ctype English_United States.utf8
tz UTC
date 2022-10-11
```
And here is my Mac where the bug doesn't show up by default because `TZ =
""`:
R version 4.2.1 (2022-06-23)
Platform: x86_64-apple-darwin17.0 (64-bit)
Running under: macOS Big Sur ... 10.16
BLAS:
/Library/Frameworks/R.framework/Versions/4.2/Resources/lib/libRblas.0.dylib
LAPACK:
/Library/Frameworks/R.framework/Versions/4.2/Resources/lib/libRlapack.dylib
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
[1] stats graphics grDevices utils datasets methods base
loaded via a namespace (and not attached):
[1] "America/New_York"
```
On Thu, Oct 6, 2022 at 9:33 AM Davis Vaughan <davis at rstudio.com> wrote:
Hi all,
I have found another POSIXlt bug while I've been fiddling around with it.
This one only appears on specific OSes, because it has to do with the fact
that the `gmtoff` field is optional, and isn't always used on all OSes. It
also doesn't seem to be specific to r-devel, I think it has been there
awhile.
Here is the bug:
```
x <- as.POSIXlt(as.POSIXct("2013-01-31", tz = "America/Chicago"))
# Oh no!
x[1] <- NA
#> Error in x[[n]][i] <- value[[n]] : replacement has length zero
```
If you look at the objects, you can see that `x` has a `gmtoff` field, but
`NA` (when converted to POSIXlt, which is what `[<-.POSIXlt` does) does not:
```
unclass(x)
#> $sec
#> [1] 0
#>
#> $min
#> [1] 0
#>
#> $hour
#> [1] 0
#>
#> $mday
#> [1] 31
#>
#> $mon
#> [1] 0
#>
#> $year
#> [1] 113
#>
#> $wday
#> [1] 4
#>
#> $yday
#> [1] 30
#>
#> $isdst
#> [1] 0
#>
#> $zone
#> [1] "CST"
#>
#> $gmtoff
#> [1] -21600
#>
#> attr(,"tzone")
#> [1] "America/Chicago" "CST" "CDT"
unclass(as.POSIXlt(NA))
#> $sec
#> [1] NA
#>
#> $min
#> [1] NA
#>
#> $hour
#> [1] NA
#>
#> $mday
#> [1] NA
#>
#> $mon
#> [1] NA
#>
#> $year
#> [1] NA
#>
#> $wday
#> [1] NA
#>
#> $yday
#> [1] NA
#>
#> $isdst
#> [1] -1
#>
#> attr(,"tzone")
#> [1] "UTC"
```
The problem seems to be that `[<-.POSIXlt` assumes that if the field was
there in `x` then it must also be there in `value`:
https://github.com/wch/r-source/blob/e10a971dee6a0ab851279c183cc21954d66b3be4/src/library/base/R/datetime.R#L1303-L1304
But this isn't the case for the `NA` value that was converted to POSIXlt.
I can't reproduce this on my personal Mac, but it affects the Linux, Mac,
and Windows machines we use for the lubridate CI checks through GitHub
Actions.
Thanks,
Davis
[[alternative HTML version deleted]]