通过类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
类列表的文档说,is.list(tm)
当且仅当tm
列表或者是一个pairlist时,它is.pairlist(tm)
是TRUE ,并且当且仅当它tm
是一个pairlist或NULL 时才为TRUE .
> 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
通过这种方式的文件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
列表或不?
它是一个带有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
我们可以恢复指定的列表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