为什么dput()/ dput2()无法与Polygons / SpatialPolygons一起使用

时间:2018-07-25 15:03:29

标签: r spatial sp sf

我想问另一个问题,其中包括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'不是   找到

  • 那么如何使SpatialPolygons对象可复制?

一种解决方法是将对象转换为简单特征,然后使用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))

1 个答案:

答案 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的设置中执行此操作。