目标:打印从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,所以有人可以对此有所了解吗?
答案 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>
没有为[[
类定义,它仍然会像普通列表那样表现。