问题
I'm writing my own R package and would like to plot a spatialPolygonsDataFrame
object. If I were writing it as a script I would simply load the necessary packages (maptools
, rgdal
, and rgeos
) with library()
and plot with plot(x)
.
When writing a package to build using library()
is not advised, instead it is usual to load the package by adding it to Imports:
in the NAMESPACE
. If I do this I receive the following error:
Error in as.double(y) : cannot coerce type 'S4' to vector of type 'double'
This is is corrected by loading the maptools package with library()
if writing a script.
I know you can load individual methods with ImportMethodsFrom
in the NAMESPACE
so have tried to import a plot method from maptools
using this approach but have had no luck. When I looked in the NAMESPACE
of the maptools
package I couldn't find a plot method exported. I've seen there is a plot.Spatial
function which I have tried to import to my NAMESPACE
without success:
No methods found in "maptools" for requests: plot.Spatial
Finally, I have tried adding maptools
to Depends:
instead of Imports:
in my NAMESPACE
and this does work. Is this the canonical way to do this? It seems overkill to attach a whole package for one method (plus I don't know what functions have been masked, etc.). What is the best way to load the necessary tools to plot maps within a self-authored function?
Edit 1: In response to @Hack-R's question, I don't know if plot.Spatial is the only method I need, or even if it's the correct one. It's my educated guess that this will enable me to plot spatial
objects.
回答1:
plot.Spatial
is internal and is in sp
and not maptools, which I think is the answer here. You are looking at the wrong package.
As discussed in the comments, you can simply use sp::plot
.
For developing a package, there's a bit more to it.
If you import the methods for plot
so that your functions can use it internally, but it won't be available to users unless they library(sp)
. You could re-export it, so your users don't have to attach sp
- but you'll need to document it and perhaps explain why, and also check there's no issues if sp is attached.
This is a bit of a challenging topic that is well explained here: http://r-pkgs.had.co.nz/namespace.html I was pretty comfortable with namespaces but only recently realized you could re-export a function that you import from another - so you could provide sp's plot.Spatial without Depends: sp.
I override the print methods for Spatial in a package I use, and that in in turn overrides the overrides that raster
provides - there's no stopping you doing this, it's a matter of managing the user expectations and hopefully not making things hard/er. You probably don't want to override a generic like plot
for normal use, it's clearer if you have a myPlot
that does that specifically, or add your own classes.
It's another level complicated though, since plot.Spatial
is internal, and it's source is used to define an S4 method for plot. You can see the methods with showMethods("plot")
and then get the internal functions that provide those with findMethods("plot")[["Spatial#missing"]]
or findMethods("plot")[["SpatialPolygons#missing"]]
.
回答2:
@mdsumner's answer pointed me in the right direction and was a useful discussion in its own right.
The answer to my specific query to plot spatialPolygonsDataFrame
objects was to add sp
to Imports:
and call sp::plot()
来源:https://stackoverflow.com/questions/38818682/self-authored-package-load-plot-method-for-spatialpolygonsdataframe