通过类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
NULL
Run Code Online (Sandbox Code Playgroud)
类列表的文档说,is.list(tm)当且仅当tm列表或者是一个pairlist时,它is.pairlist(tm)是TRUE ,并且当且仅当它tm是一个pairlist或NULL 时才为TRUE .
> is.list(tm)
[1] TRUE
> is.pairlist(tm)
[1] FALSE
Run Code Online (Sandbox Code Playgroud)
因此tm必须是一个清单.
但"list"不是"POSIXlt"的超类:
> is(tm)
[1] "POSIXlt" "POSIXt" "oldClass"
> extends("POSIXlt")
[1] "POSIXlt" "POSIXt" "oldClass"
Run Code Online (Sandbox Code Playgroud)
extends 否定问题如果"POSIXlt"范围"列表",答案甚至不是"可能":
> extends("POSIXlt","list")
[1] FALSE
Run Code Online (Sandbox Code Playgroud)
此外,
> is("POSIXlt","list")
[1] FALSE
> is(tm,"list")
[1] FALSE
Run Code Online (Sandbox Code Playgroud)
通过这种方式的文件istm不能被视为来自"列表".特别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] TRUE
Run Code Online (Sandbox Code Playgroud)
as(tm,"list") 确实有POSIXlt类文档中指定的组件,但名称已消失.
列表是什么意思?为tm列表或不?
它是一个带有c("POSIXct", "POSIXt")类和tzone属性的命名列表:
POSIXlt =命名列表+ class + tzone属性
实际上,我们可以L通过添加class和这样的属性来从命名列表中构建或制造这样的对象tzone:
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
Run Code Online (Sandbox Code Playgroud)
我们可以恢复指定的列表L从tm通过删除class和tzone属性:
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
Run Code Online (Sandbox Code Playgroud)
在开始回答之前,我会问:你为什么想知道? 特别是,我认为您可以在这里就一个更具体的问题获得更好的建议,即“我想在以下上下文中将类型的对象视为POSIXlt列表:这会起作用吗?甚至,”在什么情况下会处理类型的对象输入POSIXlt为列表会给我带来麻烦吗?”要求对 R 的形式语义进行澄清并不是没有道理的,但您可能会发现它有点模糊。
我认为(但希望更有知识的人能插话,在这种情况下我可能会删除它)您已经陷入了 R 面向对象的一些阴暗的暗流,即旧的/内置的类并不总是以天真的预期方式遵循所有语义(尽管足够仔细地阅读文档可能表明它在技术上是正确的)。特别是,我确信extends()并且is()按照 S4 对象(天真的)预期的方式工作,我对具有 S3 方法的对象不太确定,并且我对内置类最不确定。
FWIWdata.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] TRUE
Run Code Online (Sandbox Code Playgroud)