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

spatial_df@data$column 
spatial_df$column 

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

一个可能的答案在 sp documentations 中,其中提到了 SpatialPolygonsDataFrame 类的方法 [。但是,由于 $ 等同于 [[,而不是 [,我不确定这就是答案。

请您参考如下方法:

简短的回答是 $ 的这种行为是由 sp 包中的 Spatial 类实现的,而不是通用 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-classSpatial-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"]] 的快捷方式


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!