В чем разница между извлечением через $и @в R?

Интересно, в чем разница между операциями "компонент/слот" (через ?Syntax) $ (знак доллара) и @ (при символе) в R.

Вот пример с $:

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

Отпечатки:

 [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 

Вот пример с @:

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

Отпечатки:

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

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

В любом случае, почему одно работает, а не другое?

Еще один пример из пакета SoDA в R в функции geoXY:

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

Ответ 1

Я ничего не вижу в R Language defenition об этом (через this),

Но разница в основном: @ для объектов S4, $ для списков (включая многие объекты S3).

Это может быть немного абстрактно, поэтому, если вам интересно, что использовать для данного объекта, просто посмотрите str, например:

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

Здесь мы можем видеть $, поэтому $ - что использовать.

В качестве альтернативы,

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

Здесь мы видим @, поэтому @ - это то, что нужно использовать.

Это может стать еще более запутанным, когда объект S4 имеет список в одном из своих слотов (первое, что приходит мне в голову, - это SpatialPolygonsDataFrame, где столбец в слоте data можно получить через [email protected]$column)

Возможно, см. также ?slot, который дает немного более подробную информацию, относящуюся к @, ?isS4 для альтернативы str, чтобы сказать вам, можно ли ожидать, что @ будет работать с объектом, или Глава книги Хэдли Уикхема на объектах S4 для большей части S4 в целом.