我正在尝试进行一些地理空间分析,R
其中将涉及SpatialPolygonsDataFrame
在绘图期间向 s 添加属性以进行着色等。
对于组织,我想SpatialPolygonsDataFrame
通过合并和更新将这些属性添加到我的 s 中,但我不断收到“无效.internal.selfref
”警告并且不会添加列。
戳这里的问题和答案,似乎与SpatialPolygonsDataFrame
对象的数据存储在 a中的事实有关list
,但是答案对于如何处理这个问题没有帮助,因为它们通常处理用户定义list
的 s而不是像这里这样从包装中出来的。
这是一个使用愚蠢 shapefile 的简单示例,比如说美国(你会注意到我使用下面的 500k 分辨率):
library(maptools)
us.states<-readShapePoly("cb_2014_us_state_5m.shp")
setDT(us.states@data) #works fine
> class(us.states@data)
[1] "data.table" "data.frame"
us.states@data[,test:=1L]
警告消息:在:通过获取(浅)副本检测和修复
`[.data.table`(us.states@data, , `:=`(test, 1L))
无效,以便可以通过引用添加此新列。在较早的时候,这已被复制 (或使用或类似方法手动创建)。避免, 并且目前(奇怪地)可能会复制整个 . 请改用语法以避免复制: 和. 此外, in ,复制了整个 和(用于复制命名对象);请升级到.internal.selfref
data.table
:=
data.table
R
structure()
key<-
names<-
attr<-
R
data.table
set*
?set
?setnames
?setattr
R<=v3.0.2
list(DT1,DT2)
DT1
DT2
R
list()
R>v3.0.2
如果那是咬人的。如果此消息没有帮助,请向 datatable-help 报告,以便修复根本原因。
这种与我从其他相关答案中收集到的内容不谋而合,但我至少预计数据会更新,但唉:
> names(us.states@data)
[1] "STATEFP" "STATENS" "AFFGEOID" "GEOID" "STUSPS" "NAME"
"LSAD" "ALAND" "AWATER"
有什么方法可以继续使用:=
通过引用语法进行的舒适更新来处理SpatialPolygonsDataFrame
(或类似的.shp
检索对象)?
现在,我通过复制来使用更新,这很有效,例如:
us.states@data<-copy(us.states@data)[,test:=1L]
> names(us.states@data)
[1] "STATEFP" "STATENS" "AFFGEOID" "GEOID" "STUSPS" "NAME" "LSAD"
[8] "ALAND" "AWATER" "test"