为什么可以使用`$`来子集SpatialPolygonsDataFrame?

时间:2014-12-15 04:02:48

标签: r spatial

当我有一个SpatialPolygonsDataFrame对象时,我知道我可以通过两种方式获取数据:

spatial_df@data$column
spatial_df$column

但是我不明白为什么第二种方式是可能的。我认为我必须使用data访问@广告位?这是SpatialPolygonsDataFrame类的独特之处,还是一般的S4对象?

sp documentations中有一个可能的答案,其中提到了[类的方法SpatialPolygonsDataFrame。但是,由于$相当于[[,而不是[,我不确定答案是否正确。

1 个答案:

答案 0 :(得分:6)

简短的回答是$的这种行为是由Spatial包中的sp类实现的,并不是一般S4对象的特征。

答案很长(我怎么知道这个):

  • 使用showMethods("$")了解通用$的所有方法。
The result shows:
Function: $ (package base)
x="C++Class"
x="envRefClass"
x="Module"
x="Raster"
x="refObjectGenerator"
x="Spatial"
x="SpatialGDAL"
x="SpatialPoints"
x="SpatialPolygonsDataFrame"
    (inherited from: x="Spatial")

因此,我们知道SpatialPolygonsDataFrame-class会从$继承Spatial-class。我们通过以下方式找到了根:

  • getMethod("$", "Spatial"),其中显示$ Spatial-class的实施情况如下:
Method Definition:

function (x, name) 
{
    if (!("data" %in% slotNames(x))) 
        stop("no $ method for object without attributes")
    x@data[[name]]
}
<environment: namespace:sp>

因此,spatial_df$col_namespatial_df@data[["col_name"]]

的快捷方式