提取运算符' [' - POSIXlt未显示的列表打印日期时间

时间:2016-06-18 18:37:07

标签: r rstudio

目标:打印从POSIXlt对象获取的列表的第一个元素。

代码

> x <- as.POSIXlt(Sys.time())
> x
[1] "2016-06-18 23:51:14 IST"
> x[1]
[1] "2016-06-18 23:51:14 IST"
> x[[1]]
[1] 14.70887
> temp <- list(999,23,3)  
> temp[1]
[[1]]
[1] 999
> temp[[1]]
[1] 999

当我们使用单个提取访问POSIXlt对象x时,会打印整个日期时间,但是当我们类似地访问另一个列表(temp)时,第一个元素将作为列表打印(因为单个括号提取返回相同的宾语)。第一个元素虽然是在我使用双支架提取时检索到的。新到R,所以有人可以对此有所了解吗?

1 个答案:

答案 0 :(得分:1)

从正常列表索引POSIXlt对象的异常行为与[类的POSIXlt运算符的定义方式有关。如果您查看[.POSIXlt的源代码,您会发现它是以非常直观的方式定义的。它不是对列表进行子集化,而是循环遍历列表,拾取每个元素并重新分配属性,使x[1]x基本相同。所以我的评论被length(l)误导了,后者返回一个,这是因为类length的{​​{1}}函数是以这种方式定义的。更仔细地检查两个函数定义,您将看到行为不正常的原因POSIXlt

list

[函数定义:

POSIXlt
`[.POSIXlt` function (x, ..., drop = TRUE) { val <- lapply(X = x, FUN = "[", ..., drop = drop) # note how the above line has looped through the original list and collected all of them attributes(val) <- attributes(x) val } <bytecode: 0x105dc90d8> <environment: namespace:base>

length函数定义:

POSIXlt

此外,由于length.POSIXlt function (x) length(x[[1L]]) # this will always return one <bytecode: 0x102270a68> <environment: namespace:base> 没有为[[类定义,它仍然会像普通列表那样表现。