r-自行编写的包:空间多边形数据帧的加载绘图方法



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

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

错误为.double(y(:无法将类型"S4"强制为类型"double"的矢量

如果编写脚本,则通过将library()加载到maptools包来纠正此问题。

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

在"maptools"中找不到用于请求的方法:plot。空间

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

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

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

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

对于开发一个包,还有更多的东西

如果导入plot的方法,以便函数可以在内部使用它,但除非用户library(sp),否则用户将无法使用它。您可以重新导出它,这样您的用户就不必附加sp,但您需要对它进行文档记录,也许还需要解释原因,并检查是否附加了sp。

这是一个有点挑战性的话题,这里有很好的解释:http://r-pkgs.had.co.nz/namespace.html我对名称空间很熟悉,但直到最近才意识到,可以重新导出从另一个导入的函数,这样就可以提供sp的绘图。无依赖项的空间:sp.

我在我使用的包中覆盖了Spatial的打印方法,这反过来又覆盖了raster提供的覆盖——这是无法阻止的,这是一个管理用户期望的问题,希望不会让事情变得困难。您可能不想为了正常使用而重写像plot这样的泛型,如果您有一个专门做这件事的myPlot,或者添加您自己的类,那就更清楚了。

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

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

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

最新更新