当我有一个SpatialPolygonsDataFrame对象时,我知道我可以通过两种方式获取数据:
spatial_df@data$column
spatial_df$column
但是我不明白为什么第二种方式是可能的。我认为我必须使用data
访问@
广告位?这是SpatialPolygonsDataFrame
类的独特之处,还是一般的S4对象?
sp
documentations中有一个可能的答案,其中提到了[
类的方法SpatialPolygonsDataFrame
。但是,由于$
相当于[[
,而不是[
,我不确定答案是否正确。
答案 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_name
是spatial_df@data[["col_name"]]