as.list() 在 POSIXlt 原子向量上不可能吗?

Is as.list() not possible on POSIXlt atomic vectors?

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 分类的原子向量不起作用是故意的吗?如果是,为什么?

没有 as.list.POSIXlt 方法,所以使用 as.list.default,它执行以下操作:

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

因为你的xtypeoflist,上面的表达式returns是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代替。