自创包:spatialPolygonsDataFrame的load plot方法
Self-authored package: load plot method for spatialPolygonsDataFrame
我正在编写我自己的 R 程序包并想绘制一个 spatialPolygonsDataFrame
对象。如果我把它写成脚本,我会简单地用 library()
加载必要的包(maptools
、rgdal
和 rgeos
)并用 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
package 和 library()
如果写脚本。
我知道您可以在 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.Spatial
是 internal 并且在 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()
我正在编写我自己的 R 程序包并想绘制一个 spatialPolygonsDataFrame
对象。如果我把它写成脚本,我会简单地用 library()
加载必要的包(maptools
、rgdal
和 rgeos
)并用 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
package 和 library()
如果写脚本。
我知道您可以在 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.Spatial
是 internal 并且在 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()