首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"POSIXlt“类的R对象是不是"list”?

"POSIXlt“类的R对象是不是"list”?
EN

Stack Overflow用户
提问于 2015-12-24 23:29:46
回答 2查看 478关注 0票数 8

根据documentation of the class POSIXlt,POSIXlt类的对象是一个命名列表。确实是这样:

代码语言:javascript
复制
> 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

documentation of the class list表示,当且仅当is.list(tm)是列表或配对列表时,tm为真;当且仅当tm为配对列表或NULL时,is.pairlist(tm)为真。

代码语言:javascript
复制
> is.list(tm)
[1] TRUE
> is.pairlist(tm)
[1] FALSE

因此,tm必须是一个列表。

但是"list“不是”POSIXlt“的超类:

代码语言:javascript
复制
> is(tm)
[1] "POSIXlt"  "POSIXt"   "oldClass"
> extends("POSIXlt")
[1] "POSIXlt"  "POSIXt"   "oldClass"

extends否定了问题if "POSIXlt“extents "list",答案甚至不是”可能“:

代码语言:javascript
复制
> extends("POSIXlt","list")
[1] FALSE

此外,

代码语言:javascript
复制
> 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是相同的:

代码语言:javascript
复制
> 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

as(tm,"list")确实有在类POSIXlt的文档中指定的组件,但是名称已经消失了。

作为一个列表是什么意思?tm是不是一个列表?

EN

回答 2

Stack Overflow用户

发布于 2015-12-24 23:43:14

它是一个具有c("POSIXct", "POSIXt")类和tzone属性的命名列表:

POSIXlt =命名列表+类+分区属性

实际上,我们可以通过添加classtzone属性从命名列表L构建或制造这样的对象,如下所示:

代码语言:javascript
复制
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

我们可以通过删除classtzone属性来从tm恢复命名列表L

代码语言:javascript
复制
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
票数 7
EN

Stack Overflow用户

发布于 2015-12-24 23:40:49

在我开始回答这个问题之前,我会问:你为什么想知道?特别是,我认为您可以在这里得到更具体的建议,比如“我想在以下上下文中将POSIXlt类型的对象作为列表处理:这行得通吗?甚至,”在什么情况下将POSIXlt类型的对象作为列表处理会给我带来麻烦?“要求澄清R的形式语义并不是没有道理的,但是您可能会发现它有点模糊。

我认为(但希望更有知识的人会加入进来,在这种情况下,我可能会删除这一点),您已经陷入了R面向对象的一些模糊的暗流,即旧的/内置的类并不总是以天真的预期方式遵循所有的语义(尽管足够仔细地阅读文档可能会表明它在技术上是正确的)。特别是,对于S4对象,我确信extends()is()的工作方式是(幼稚的),对于使用S3方法的对象,我不太确定,对于内置的类,我最不确定。

FWIW data.frame也有同样的困惑:它到底是不是一个列表?(该类执行extend列表,但不继承它们...)

代码语言:javascript
复制
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
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34454916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档