extending sp classes
On Fri, 6 Oct 2006, Roger Bivand wrote:
On Fri, 6 Oct 2006, Katarzyna Adamczyk wrote:
Dear members of r-sig-geo, I discovered "sp" library and I found it very usefull for switching between different classes of R spatial libraries. I defined my own class, extending SpatialPolygonsDataFrame. When I try to apply "spplot" function to the extended class, it doesn't work : I have a coercion problem error message, but I don't know what it means. I proceeded as follows: I considered SpatialPolygonsDataFrame help example : grd <- GridTopology(c(1,1), c(1,1), c(10,10)) polys <- as.SpatialPolygons.GridTopology(grd) centroids <- getSpPPolygonsLabptSlots(polys) x <- centroids[,1] y <- centroids[,2] z <- 1.4 + 0.1*x + 0.2*y + 0.002*x*x ex_1.7 <- SpatialPolygonsDataFrame(polys, data=data.frame(x=x, y=y, z=z, row.names=getSpPPolygonsIDSlots(polys))) spplot(ex_1.7) I defined my own class :
> setClass("myclass",contains="SpatialPolygonsDataFrame")
[1] "myclass"
> ex<-ex_1.7 > class(ex) = "myclass" > is(ex)
[1] "myclass" "SpatialPolygonsDataFrame" [3] "SpatialPolygons" "Spatial"
> spplot(ex)
Erreur dans as.data.frame.default(obj) : cannot coerce class "myclass" into a data.frame Did anyone of you encounter a similar problem and can help me?
Well, writing new-style classes is quite advanced. If you are not on Windows, please download the source package, and try editing line 158 of R/spplot.R from: sdf = as.data.frame(obj) to sdf = as(obj, "data.frame") to see if that way of doing method dispatch works:
t1 <- as.data.frame(ex)
Error in as.data.frame.default(ex) : cannot coerce class "myclass" into a data.frame
t2 <- as(ex, "data.frame") class(t2)
[1] "data.frame" suggests that it might. I guess that "myclass" actually is richer, please let us know how you get on. If you are on Windows, you will need to write a small wrapper function like:
as.data.frame.myclass <- function(obj) obj at data t1 <- as.data.frame(ex) class(t1)
[1] "data.frame" This doesn't yet work, but you get the idea - provide an old-style method to match the one that cannot be found.
The missing bit, after providing an as.data.frame method for your class,
was to either specify the zcol= argument:
spplot(ex, zcol=c("x", "y", "z"))
or provide a names() method for your class:
names.myclass <- function(x) names(x at data)
spplot(ex)
The next > 0.9-2 release of sp will remove the as.data.frame() problem,
but a names() method will be needed if zcol= cannot be used.
Roger
Roger
Thank you in advance. Katarzyna
_______________________________________________ R-sig-Geo mailing list R-sig-Geo at stat.math.ethz.ch https://stat.ethz.ch/mailman/listinfo/r-sig-geo
Roger Bivand Economic Geography Section, Department of Economics, Norwegian School of Economics and Business Administration, Helleveien 30, N-5045 Bergen, Norway. voice: +47 55 95 93 55; fax +47 55 95 95 43 e-mail: Roger.Bivand at nhh.no