【问题标题】:Is an R object of class "POSIXlt" a "list" or not?“POSIXlt”类的R对象是否是“列表”?
【发布时间】:2015-12-24 15:29:46
【问题描述】:

通过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
NULL

documentation of the class list 表示is.list(tm) 为 TRUE 当且仅当tm 是一个列表或一对列表, 并且is.pairlist(tm) 是 TRUE 当且仅当 tm 是对列表或 NULL。

> 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 否定了这个问题,如果“POSIXlt”延伸到“列表”,答案甚至不是“也许”:

> extends("POSIXlt","list")
[1] FALSE

此外,

> is("POSIXlt","list")
[1] FALSE
> is(tm,"list")
[1] FALSE

documentation of is 这意味着tm 不能被视为来自“列表”。特别是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

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

列表是什么意思? tm 是不是列表?

【问题讨论】:

    标签: r list


    【解决方案1】:

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

    POSIXlt = 命名列表 + 类 + tzone 属性

    事实上,我们可以通过添加classtzone 属性,从命名列表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
    

    我们可以通过删除classtzone属性从​​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
    

    【讨论】:

      【解决方案2】:

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

      认为(但希望有更多知识的人会加入,在这种情况下我可能会删除它)你偶然发现了 R 面向对象的一些阴暗的暗流,即旧的/内置的类并不总是以天真预期的方式遵循所有语义(尽管足够仔细地阅读文档可能表明它在技术上是正确的)。特别是,我确信 extends()is() 可以(天真地)对 S4 对象起作用,我不太确定具有 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] TRUE
      

      【讨论】:

      猜你喜欢
      • 2014-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-10
      • 1970-01-01
      • 2023-02-25
      • 2023-04-08
      • 1970-01-01
      相关资源
      最近更新 更多