根据documentation of the class POSIXlt,POSIXlt类的对象是一个命名列表。确实是这样:
> tm <- strptime( "24-12-2015 05:28:12", format="%d-%m-%Y %H:%M:%S", tz="UTC" )
> class(tm)
[1] "POSIXlt" "POSIXt"
> tm$sec
[1] 12
> tm$min
[1] 28
> tm$hour
[1] 5
> tm$mday
[1] 24
> tm$mon
[1] 11
> tm$year
[1] 115
> tm$wday
[1] 4
> tm$yday
[1] 357
> tm$isdat
NULL
> tm$zone
NULL
> tm$gmtoff
NULLdocumentation of the class list表示,当且仅当is.list(tm)是列表或配对列表时,tm为真;当且仅当tm为配对列表或NULL时,is.pairlist(tm)为真。
> is.list(tm)
[1] TRUE
> is.pairlist(tm)
[1] FALSE因此,tm必须是一个列表。
但是"list“不是”POSIXlt“的超类:
> is(tm)
[1] "POSIXlt" "POSIXt" "oldClass"
> extends("POSIXlt")
[1] "POSIXlt" "POSIXt" "oldClass"extends否定了问题if "POSIXlt“extents "list",答案甚至不是”可能“:
> extends("POSIXlt","list")
[1] FALSE此外,
> is("POSIXlt","list")
[1] FALSE
> is(tm,"list")
[1] FALSE通过documentation of is,这意味着tm不能被视为来自"list“。特别是,tm不是一个列表。但是,如果tm不能被视为来自“列表”,那么为什么as能够成功地将tm强制到列表中呢?as(tm.list无疑是一个列表,而as.list(tm)和tm是相同的:
> as(tm,"list")
[[1]]
[1] 12
[[2]]
[1] 28
[[3]]
[1] 5
[[4]]
[1] 24
[[5]]
[1] 11
[[6]]
[1] 115
[[7]]
[1] 4
[[8]]
[1] 357
[[9]]
[1] 0
> class(as(tm,"list"))
[1] "list"
> is.list(as(tm,"list"))
[1] TRUE
> is(as(tm,"list"),"list")
[1] TRUE
> identical(tm,as.list(tm))
[1] TRUEas(tm,"list")确实有在类POSIXlt的文档中指定的组件,但是名称已经消失了。
作为一个列表是什么意思?tm是不是一个列表?
发布于 2015-12-24 23:43:14
它是一个具有c("POSIXct", "POSIXt")类和tzone属性的命名列表:
POSIXlt =命名列表+类+分区属性
实际上,我们可以通过添加class和tzone属性从命名列表L构建或制造这样的对象,如下所示:
L <- list(sec = 12, min = 28L, hour = 5L, mday = 24L, mon = 11L,
year = 115L, wday = 4L, yday = 357L, isdst = 0L)
tm0 <- L # start with list L
class(tm0) <- c("POSIXlt", "POSIXt") # add class
attr(tm0, "tzone") <- "UTC" # add tzone
tm <- strptime( "24-12-2015 05:28:12", format="%d-%m-%Y %H:%M:%S", tz="UTC" )
identical(tm0, tm)
## [1] TRUE我们可以通过删除class和tzone属性来从tm恢复命名列表L:
tm <- strptime( "24-12-2015 05:28:12", format="%d-%m-%Y %H:%M:%S", tz="UTC" ) # start w tm
L0 <- unclass(tm) # remove class
attr(L0, "tzone") <- NULL # remove tzone
identical(L0, L)
## [1] TRUE发布于 2015-12-24 23:40:49
在我开始回答这个问题之前,我会问:你为什么想知道?特别是,我认为您可以在这里得到更具体的建议,比如“我想在以下上下文中将POSIXlt类型的对象作为列表处理:这行得通吗?甚至,”在什么情况下将POSIXlt类型的对象作为列表处理会给我带来麻烦?“要求澄清R的形式语义并不是没有道理的,但是您可能会发现它有点模糊。
我认为(但希望更有知识的人会加入进来,在这种情况下,我可能会删除这一点),您已经陷入了R面向对象的一些模糊的暗流,即旧的/内置的类并不总是以天真的预期方式遵循所有的语义(尽管足够仔细地阅读文档可能会表明它在技术上是正确的)。特别是,对于S4对象,我确信extends()和is()的工作方式是(幼稚的),对于使用S3方法的对象,我不太确定,对于内置的类,我最不确定。
FWIW data.frame也有同样的困惑:它到底是不是一个列表?(该类执行extend列表,但不继承它们...)
dd <- data.frame("xys")
is(dd,"list")
## [1] FALSE
extends("data.frame","list")
## [1] TRUE
inherits(dd,"list")
## [1] FALSE
is.list(dd)
## [1] TRUEhttps://stackoverflow.com/questions/34454916
复制相似问题