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

Hei*_*erg 3 r spatial

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

spatial_df@data$column
spatial_df$column
Run Code Online (Sandbox Code Playgroud)

但是我不明白为什么第二种方式是可能的.我以为我必须data使用@?这是关于SpatialPolygonsDataFrame类的独特之处,还是关于S4对象的一般情况?

一个可能的答案是在sp文档中,它提到[SpatialPolygonsDataFrame课程的方法.但是,因为$相当于[[,不是[,我不确定这是答案.

Hei*_*erg 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")
Run Code Online (Sandbox Code Playgroud)

所以我们知道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>
Run Code Online (Sandbox Code Playgroud)

因此,spatial_df$col_name是一个捷径spatial_df@data[["col_name"]]