当我有一个SpatialPolygonsDataFrame对象时,我知道我可以通过两种方式获取数据:
spatial_df@data$column
spatial_df$column
Run Code Online (Sandbox Code Playgroud)
但是我不明白为什么第二种方式是可能的.我以为我必须data使用@?这是关于SpatialPolygonsDataFrame类的独特之处,还是关于S4对象的一般情况?
一个可能的答案是在sp文档中,它提到[了SpatialPolygonsDataFrame课程的方法.但是,因为$相当于[[,不是[,我不确定这是答案.
简短的回答是,这种行为$是由包中的Spatial类实现的sp,并不是一般S4对象的特征.
答案很长(我怎么知道这个):
showMethods("$")来了解通用的所有方法$.Run Code Online (Sandbox Code Playgroud)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如下:Run Code Online (Sandbox Code Playgroud)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"]]