自创包:spatialPolygonsDataFrame的load plot方法

Self-authored package: load plot method for spatialPolygonsDataFrame

我正在编写我自己的 R 程序包并想绘制一个 spatialPolygonsDataFrame 对象。如果我把它写成脚本,我会简单地用 library() 加载必要的包(maptoolsrgdalrgeos)并用 plot(x) 绘图。

当使用 library() is not advised 编写要构建的包时,通常通过将其添加到 NAMESPACE 中的 Imports: 来加载包。如果我这样做,我会收到以下错误:

Error in as.double(y) : cannot coerce type 'S4' to vector of type 'double'

这是 corrected by loading the maptools packagelibrary() 如果写脚本。

我知道您可以在 NAMESPACE 中使用 ImportMethodsFrom 加载单独的方法,因此尝试使用这种方法从 maptools 导入绘图方法,但没有成功。当我查看 maptools 包的 NAMESPACE 时,我找不到导出的绘图方法。我看到有一个 plot.Spatial 函数,我试图将其导入 NAMESPACE 但没有成功:

No methods found in "maptools" for requests: plot.Spatial

最后,我尝试将 maptools 添加到 Depends: 而不是 NAMESPACE 中的 Imports:,这确实有效。这是执行此操作的规范方法吗?为一种方法附加整个包似乎有些过分(而且我不知道哪些功能被屏蔽了,等等)。加载必要工具以在自行编写的函数中绘制地图的最佳方式是什么?

编辑 1:针对@Hack-R 的问题,我不知道 plot.Spatial 是否是我唯一需要的方法,或者即使它是正确的方法。这是我有根据的猜测,这将使我能够绘制 spatial 个对象。

plot.Spatialinternal 并且在 sp 而不是 maptools 中,我认为这就是这里的答案。你看错包裹了。

如评论中所述,您可以简单地使用 sp::plot

要开发一个包,还有更多内容。

如果您导入 plot 的方法以便您的函数可以在内部使用它,但除非用户 library(sp).您可以重新导出它,这样您的用户就不必附加 sp - 但您需要对其进行记录并可能解释原因,并检查是否附加了 sp 没有问题。

这是一个有点挑战性的话题,这里有很好的解释:http://r-pkgs.had.co.nz/namespace.html我对名称空间很满意,但直到最近才意识到你可以重新导出你从另一个导入的函数 - 所以你可以提供没有 Depends: sp 的 sp 的 plot.Spatial。

我在我使用的包中重写了 Spatial 的打印方法,这反过来又重写了 raster 提供的重写 - 没有人会阻止你这样做,这是管理用户期望和希望不要制造东西 hard/er。您可能不想覆盖像 plot 这样的泛型以供正常使用,如果您有一个专门这样做的 myPlot 或者添加您自己的 类 会更清楚。

这是另一个复杂的层次,因为 plot.Spatial 内部的 ,并且它的源代码用于定义绘图的 S4 方法。您可以查看带有 showMethods("plot") 的方法,然后获取提供带有 findMethods("plot")[["Spatial#missing"]]findMethods("plot")[["SpatialPolygons#missing"]] 的方法的内部函数。

@mdsumner 的回答为我指明了正确的方向,并且本身就是一个有用的讨论。

我对绘制 spatialPolygonsDataFrame 对象的特定查询的回答是将 sp 添加到 Imports: 并调用 sp::plot()