2015-11-21 1 views
10

Je me demande quelle est la différence entre la "composante/extraction à sous" (via ?Syntax) opérateurs $ (signe dollar) et @ (arobase) R.

Voici un exemple avec $:

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

impressions:

[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 

Voici un exemple avec @:

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

impressions:

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

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

Dans les deux cas, pourquoi un travail et pas l'autre?

Un autre exemple est le suivant du paquet SoDA dans R, dans la fonction geoXY:

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

@ est spécifiquement pour les objets S4. – joran

Répondre

12

Je ne vois rien dans le R Language defenition à ce sujet (via this question),

Mais la différence est essentiellement: @ est pour les objets S4, $ est pour les listes (y compris de nombreux objets S3).

Cela peut être un peu abstrait, donc si vous vous demandez ce qu'il faut utiliser pour un objet donné, il suffit de regarder à str, par exemple:

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 ... 

On peut voir $ ici, donc $ est ce que utiliser.

Alternativement,

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 ... 

Ici, nous voyons @, donc @ est ce qu'il faut utiliser.

Cela peut obtenir encore plus de confusion quand un objet S4 a une liste dans l'une de ses fentes (ce qui vient à l'esprit d'abord pour moi un SpatialPolygonsDataFrame, où une colonne dans la fente data est accessible via [email protected]$column)

Peut-être voir aussi ?slot qui donne un peu plus de détails en ce qui concerne @, ?isS4 pour une alternative à str pour vous dire si @ peut être prévu de travailler avec un objet, ou le Chapter of Hadley Wickham's book on S4 objects pour plus sur S4 en général.

+0

...Bien que toute classe S4 bien conçue devrait probablement avoir des méthodes pour accéder aux données contenues dans la classe et les utilisateurs ne devraient pas avoir à s'appuyer sur les noms de slot, mais cela est discutable ... – Spacedman