通过$和@在R中提取有什么区别?

时间:2015-11-21 17:23:22

标签: r

我想知道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)

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的更多信息。