自创包:spacePolygonsDataFrame

时间:2016-08-07 21:21:11

标签: r package spatial

我正在编写自己的R包,并希望绘制一个spatialPolygonsDataFrame对象。如果我将其作为脚本编写,我只需使用maptools加载必要的包(rgdalrgeoslibrary())并使用plot(x)绘图。

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

  

as.double(y)出错:     不能强制输入'S4'到'double'类型的矢量

如果编写脚本,则corrected by loading the maptools packagelibrary()

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

  

请求的“maptools”中找不到任何方法:plot.Spatial

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

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

2 个答案:

答案 0 :(得分:5)

plot.Spatial内部,位于sp而不是maptools,我认为这是答案。你正在看错了包裹。

正如评论中所讨论的,您只需使用sp::plot即可。

为了开发一个软件包,还有更多内容。

如果您导入plot的方法,以便您的功能可以在内部使用 ,但除非他们library(sp),否则用户无法使用它。您可以重新导出它,因此您的用户不必附加sp - 但您需要记录它并解释原因,并检查是否存在问题附有sp。

这是一个具有挑战性的话题,在这里有很好的解释:http://r-pkgs.had.co.nz/namespace.html我对命名空间非常熟悉,但最近才意识到你可以重新导出从另一个导入的函数 - 所以你可以提供sp& #39; s plot.Spatial without Depends:sp。

我在我使用的包中覆盖了Spatial的打印方法,而这反过来覆盖了raster提供的覆盖 - 没有阻止你这样做,它是一个问题管理用户期望,希望不要让事情变得困难。您可能不希望覆盖普通用途的plot这样的通用名称,如果您有myPlot专门执行此操作,或者添加自己的类,则可能会更清楚。

它的另一个级别很复杂,因为plot.Spatial内部,它的来源用于定义情节的S4方法。您可以使用showMethods("plot")查看方法,然后获取提供findMethods("plot")[["Spatial#missing"]]findMethods("plot")[["SpatialPolygons#missing"]]的方法的内部函数。

答案 1 :(得分:1)

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

我针对spatialPolygonsDataFrame个对象绘制的具体问题的答案是将sp添加到Imports:并致电sp::plot()