Является ли as.list () невозможным для атомных векторов POSIXlt? - PullRequest
0 голосов
/ 19 мая 2018

as.list() не работает с атомным вектором, классифицированным POSIXlt.

x <- as.POSIXlt(Sys.time() - 0:2)
as.list(x)
# [1] "2018-05-19 12:06:38 PDT" "2018-05-19 12:06:37 PDT" 
# [3] "2018-05-19 12:06:36 PDT"

Так как же легко превратить вектор x в список?Единственный способ, который я нашел, - использовать split().

unname(split(x, x))
# [[1]]
# [1] "2018-05-19 12:06:36 PDT"
#
# [[2]]
# [1] "2018-05-19 12:06:37 PDT"
#
# [[3]]
# [1] "2018-05-19 12:06:38 PDT"

. Кажется странным, что as.list() не работает с этим вектором.Является ли намеренным, что as.list() не работает на атомарных векторах, классифицированных POSIXlt?И если да, то почему?

1 Ответ

0 голосов
/ 19 мая 2018

Не существует метода as.list.POSIXlt, поэтому используется as.list.default, который выполняет следующее:

if (typeof(x) == "list") x else .Internal(as.vector(x, "list"))

Поскольку typeof вашего x равно list, вышеприведенное выражение возвращаетсам x, без изменений.

Похоже, что POSIXlt объекты не являются атомарными и не являются векторами - они являются списками.

unclass(x)  
is(unclass(x))    # list
as.data.frame(unclass(x))  # to illustrate the POSIXlt way of storing dates

Так как объект POSIXlt являетсяуже список, преобразующий его в список, не приводит к изменениям.

Это отличается от POSIXct.

> x2 <- as.POSIXct(Sys.time() - 0:2)
> as.list(x2)
[[1]]
[1] "2018-05-19 22:25:57 EEST"

[[2]]
[1] "2018-05-19 22:25:56 EEST"

[[3]]
[1] "2018-05-19 22:25:55 EEST"

Так что если вам нужно такое преобразование, вы можете использовать вместо него POSIXct.

...