2015-11-21 21 views
10

mi chiedo qual è la differenza tra il "estrazione componente/slot" (via ?Syntax) operatori $ (simbolo di dollaro) e @ (al simbolo) in R.

Ecco un esempio con $:

yo=data.frame(c(1:10), c(rnorm(10,0,1))) 
yo$c.1.10. 

stampe:

[1] 1 2 3 4 5 6 7 8 9 10 

[email protected] 
Error: trying to get slot "c.1.10." from an object (class "data.frame") that is not an S4 object 

Ecco un esempio con @:

setClass("track", representation(x="numeric", y="numeric")) 
myTrack <- new("track", x = -4:4, y = exp(-4:4)) 
[email protected] 

stampe:

[1] -4 -3 -2 -1 0 1 2 3 4 

myTrack$x 
Error in myTrack$x : $ operator not defined for this S4 class 

In entrambi i casi, perché fa un lavoro e non l'altro?

Un altro esempio è la seguente dal pacchetto SoDA in R, nella funzione geoXY:

library(SoDA) 
xy <- geoXY([email protected], [email protected], unit = 1000) 
plot(xy[,1], xy[,2], asp = 1) 
+2

@ è specifico per gli oggetti S4. – joran

risposta

12

io non vedo nulla nella R Language defenition su questo (via this questione),

Ma la differenza è fondamentalmente: @ è per oggetti S4, $ è per gli elenchi (compresi molti oggetti S3).

che può essere un po 'astratto, quindi, se vi state chiedendo a cosa utilizzare per un determinato oggetto, basta guardare str, ad esempio:

str(yo) 
# 'data.frame': 10 obs. of 2 variables: 
# $ c.1.10.   : int 1 2 3 4 5 6 7 8 9 10 
# $ c.rnorm.10..0..1..: num -0.536 -0.453 -0.599 1.134 -2.259 ... 

possiamo vedere $ qui, quindi è quello che $ usare.

In alternativa,

str(myTrack) 
# Formal class 'track' [package ".GlobalEnv"] with 2 slots 
# [email protected] x: int [1:9] -4 -3 -2 -1 0 1 2 3 4 
# [email protected] y: num [1:9] 0.0183 0.0498 0.1353 0.3679 1 ... 

Qui, vediamo @, quindi @ è cosa usare.

questo può diventare ancora più confusa quando un oggetto S4 dispone di un elenco in uno dei suoi slot (quello che viene in mente prima volta per me è un SpatialPolygonsDataFrame, dove una colonna nella fessura data si può accedere tramite [email protected]$column)

Forse vedi anche ?slot che fornisce un po 'più di dettaglio in riferimento a @, ?isS4 per un'alternativa a str per dirti se è possibile che @ funzioni con un oggetto o lo Chapter of Hadley Wickham's book on S4 objects per ulteriori informazioni su S4 in generale.

+0

...anche se qualsiasi classe S4 ben progettata dovrebbe probabilmente avere metodi per accedere ai dati contenuti nella classe e gli utenti non dovrebbero fare affidamento sui nomi degli slot, ma questo è discutibile ... – Spacedman

Problemi correlati