0

我正在尝试进行一些地理空间分析,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.selfrefdata.table:=data.tableRstructure()key<-names<-attr<-Rdata.tableset*?set?setnames?setattrR<=v3.0.2list(DT1,DT2)DT1DT2Rlist()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"   
4

0 回答 0