我想知道R中“组件/插槽提取”(通过?Syntax
)运算符$
(美元符号)和@
(符号)之间有什么区别。
以下是$
的示例:
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
yo@c.1.10.
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))
myTrack@x
打印:
[1] -4 -3 -2 -1 0 1 2 3 4
myTrack$x
Error in myTrack$x : $ operator not defined for this S4 class
在任何一种情况下,为什么一个工作而不是另一个?
另一个例子来自R中的SoDA
包,在函数geoXY
中:
library(SoDA)
xy <- geoXY(gpsObject1@latitude, gpsObject1@longitude, unit = 1000)
plot(xy[,1], xy[,2], asp = 1)
答案 0 :(得分:13)
我在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
# ..@ x: int [1:9] -4 -3 -2 -1 0 1 2 3 4
# ..@ y: num [1:9] 0.0183 0.0498 0.1353 0.3679 1 ...
在这里,我们看到@
,因此@
是使用的内容。
当S4对象的某个插槽中有一个列表时,这会让人更加困惑(我首先想到的是SpatialPolygonsDataFrame
,其中data
插槽中的列可以是通过spdf@data$column
)
或许另请参阅?slot
,其中提供了与@
,?isS4
相关的更多详细信息,以替代str
告诉您@
是否可以期望与一个对象一起使用,或者{4}}更多关于S4的更多信息。