我正在编写自己的R包,想绘制一个spatialPolygonsDataFrame对象.如果我写它作为一个脚本,我想简单地加载必要的包(maptools,rgdal,和rgeos用)library()和情节有plot(x).
当写一个包来构建使用library() 是不建议,代替它的是通常通过将其加入到加载包Imports:中NAMESPACE.如果我这样做,我收到以下错误:
as.double(y)出错:无法强制将'S4'强制转换为'double'类型的向量
如果编写脚本,则通过加载maptools包来更正此问题library().
我知道你可以加载单个方法用ImportMethodsFrom在NAMESPACE这样试图从导入情节方法maptools使用这种方法,但有没有运气.当我在看NAMESPACE的的maptools包我找不到出口的阴谋方法.我已经看到有一个plot.Spatial功能,我试图导入到我NAMESPACE没有成功:
请求的"maptools"中找不到任何方法:plot.Spatial
最后,我已经尝试添加maptools到Depends:而不是Imports:我的NAMESPACE,这确实工作.这是规范的方式吗?为一种方法附加整个包装似乎有点过分(另外我不知道哪些功能被屏蔽了等等).加载必要工具以在自己编写的函数中绘制地图的最佳方法是什么?
编辑1:针对@哈克-R的问题,我不知道是否plot.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"]].