我正在编写自己的R包,并想绘制一个spatialPolygonsDataFrame
对象。如果我将其作为脚本编写,我只需用library()
加载必要的包(maptools
、rgdal
和rgeos
(,并用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()