2015-12-24 9 views
8

Per il documentation of the class POSIXlt un oggetto di classe POSIXlt è un elenco con nome. E infatti:È un oggetto R di classe "POSIXlt" un "elenco" o no?

> 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 

Il documentation of the class list dice che is.list(tm) è vero se e solo se tm è una lista o un pairlist, e is.pairlist(tm) è vero se e solo se è una tm pairlist o NULL.

> is.list(tm) 
[1] TRUE 
> is.pairlist(tm) 
[1] FALSE 

Quindi tm deve essere un elenco.

Ma "lista" non è una superclasse di "POSIXlt":

> is(tm) 
[1] "POSIXlt" "POSIXt" "oldClass" 
> extends("POSIXlt") 
[1] "POSIXlt" "POSIXt" "oldClass" 

extends nega la domanda se extent "POSIXlt" "lista", la risposta non è ancora "forse":

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

Inoltre,

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

A documentation of is ciò significa che tm non possono essere trattati come da "elenco". In particolare, tm non è un elenco. Ma se tm non può essere trattato come da "elenco", perché riesce a forzare tm in un elenco? as(tm.list è senza dubbio una lista, mentre as.list(tm) e tm sono identiche:

> 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") ha i componenti indicati nella documentazione del POSIXlt classe, ma i nomi sono andati.

Cosa significa essere una lista? È tm un elenco o no?

risposta

4

Prima di iniziare questa risposta, vorrei chiedere: perché vuoi sapere? In particolare, penso che potresti ottenere un consiglio migliore qui su una domanda più specifica di "Voglio trattare un oggetto di tipo POSIXlt come un elenco nel seguente contesto: funzionerà? O anche," in quali circostanze tratteremo un oggetto di tipo POSIXlt come una lista di me nei guai?" non è irragionevole per chiedere chiarimenti sulla semantica formale di R, ma probabilmente scoprire che è un po 'torbida.

ho penso (ma spero che qualcuno più esperto possa intervenire, nel qual caso potrei cancellare questo) che sei incappato in alcune delle oscure correnti sotterranee dell'orientamento agli oggetti R, cioè che le classi più vecchie/integrate non sempre seguono tutte la semantica nel nai modo atteso (anche se una lettura sufficientemente accurata della documentazione può mostrare che è tecnicamente corretto). In particolare, sono sicuro che extends() e is() funzionano come (ingenuamente) previsto per gli oggetti S4, sono meno sicuro degli oggetti con i metodi S3 e sono il più incerto sulle classi integrate.

FWIW data.frame condivide alcuni della stessa confusione: è un elenco o no?(La classe fa extend liste, ma non eredita da loro ...)

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 
+0

vorrei capire R. Quindi la mia domanda. – mra68

+0

questa potrebbe essere una domanda migliore per 'r-devel @ r-project.org' ... –

+0

Dipende da [qual è il significato della parola" è "] (https://www.youtube.com/watch ? v = j4XT-l-_3y0). – joran

7

Si tratta di una lista di nome con una classe c("POSIXct", "POSIXt") e un attributo tzone:

POSIXlt = Chiamato lista + classe + attributo TZONE

In realtà, siamo in grado di costruire o fabbricare un oggetto da un elenco di nome L aggiungendo l'attrib class e tzone ute in questo modo:

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 

possiamo recuperare la lista di nome L da tm rimuovendo il class e l'attributo 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 
Problemi correlati