我想问另一个问题,其中包括SpatialPolygons。为了使其具有可重现性,我想对SpatialPolygons对象使用dput()
,但它不输出可重现的结构。
为什么dput()
可以与SpatialPoints一起使用,而不能与Lines / SpatialLines,Polygons / SpatialPolygons一起使用?
在示例中,导出坐标并重新创建SpatialPolygons是唯一的解决方法吗?
测试数据:
library(sp)
df = data.frame(lon=runif(10, 15,19), lat=runif(10,40,45))
dput(SpatialPoints(coordinates(df)))
dput(Lines(list(Line(coordinates(df))), 1))
dput(SpatialLines(list(Lines(list(Line(coordinates(df))), 1))))
dput(Polygons(list(Polygon(df)), 1))
dput(SpatialPolygons(list(Polygons(list(Polygon(df)), 1))))
dput(SpatialPolygons(list(Polygons(list(Polygon(df)), 1))), control="all")
this answer中的dupt2()
方法适用于Lines / SpatialLines,但不适用于发生此错误的Polygons / SpatialPolygons:
validityMethod(object)中的错误:对象'Polygons_validate_c'不是 找到
一种解决方法是将对象转换为简单特征,然后使用dput()
。他们显然很可悲。
使用LINESTRING和POLYGON的示例:
library(sp)
library(sf)
df = data.frame(lon=runif(10, 15,19), lat=runif(10,40,45))
SLi = SpatialLines(list(Lines(list(Line(coordinates(df))), 1)))
SPo = SpatialPolygons(list(Polygons(list(Polygon(df)), 1)))
dput(st_as_sf(SLi))
dput(st_as_sf(SPo))
答案 0 :(得分:1)
运行我在注释中提到的代码后,我决定提供一个临时解决方案,看看您是否a)在您的系统上有相同的结果,以及b)它是否解决了您遇到的问题。
newSpPa <- dput(SpatialPolygons(list(Polygons(list(Polygon(df)), 1))), control="all")
oldSpPa <- SpatialPolygons(list(Polygons(list(Polygon(df)), 1)))
identical(oldSpPa, newSpPa)
#[1] TRUE
从我阅读您的问题尚不清楚,是否认为返回new("SpatialPolygons", ...)
的呼叫不令人满意。我认为我执行的分配步骤与您的代码不同,并且可能只有在创建时将先前定义的对象设置在工作空间中时,我的分配才会成功。如果是这种情况,那么我认为通常的建议是在package-creation的设置中执行此操作。