当我有一个 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-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_name
是 spatial_df@data[["col_name"]]
的快捷方式