Re: [Rd] S4 method dispatch

From: Edzer Pebesma <edzer.pebesma_at_uni-muenster.de>
Date: Sun, 18 Sep 2011 12:33:09 +0200

As a follow-up, I managed to isolate the problem I sent earlier this week, and reduced it to a small case (I'm using R 2.13.1, i486-pc-linux-gnu (32-bit)).

The following script does what I expect:

setClass("A", representation(x = "numeric")) setClass("AB", representation("A"))

setGeneric("doNothing<-", function(obj, value)   standardGeneric("doNothing<-"))

setReplaceMethod("doNothing", c("A", "character"),   function(obj, value) obj)

x = new("AB", x = 10)
doNothing(x) = "irrelevant"
class(x)

setAs("AB", "A", function(from) new("A", x = from_at_x)) x = new("AB", x = 10)
doNothing(x) = "irrelevant"
class(x)

and results in class(x) being "AB".
However, the following, very similar script:

setClass("A", representation(x = "numeric")) setClass("AB", representation("A"))

setGeneric("doNothing<-", function(obj, value)   standardGeneric("doNothing<-"))

setReplaceMethod("doNothing", c("A", "character"),   function(obj, value) obj)

setAs("AB", "A", function(from) new("A", x = from_at_x))

x = new("AB", x = 10)
doNothing(x) = "irrelevant"
class(x)

returns "A" as the class of x. Why is this the case? Is this behaviour intentional?

Best regards,

On 09/14/2011 11:00 PM, Edzer Pebesma wrote:
> List,
>
> In order to get rid of some old, unreadable S3 code in package sp, I'm
> trying to rewrite things using S4 methods. Somewhere I fail, and I
> cannot sort out why. In order to isolate the problem, I created two
> functions, doNothing<- and dosth, and both should do nothing. The issue
> is that in most cases they do nothing, but in some cases dosth(obj)
> changes the class of obj and breaks with the error. I couldn't find a
> pattern when this happens, but have a few cases where it consistently
> breaks. Here's the code snippet:
>
> setGeneric("doNothing<-", function(object, value)
> standardGeneric("doNothing<-"))
>
> setReplaceMethod("doNothing",
> signature(object = "Spatial", value = "ANY"),
> function(object, value) object)
>
> dosth = function(obj) {
> cl1 = class(obj)
> doNothing(obj) = TRUE
> cl2 = class(obj)
> if (!identical(cl1, cl2)) {
> print(paste(cl1, cl2))
> stopifnot(identical(cl1, cl2))
> }
> obj
> }
>
> When things go wrong, dosth and doNothing are called with a subclass of
> Spatial, e.g. an object of class SpatialGrid, but when this gets in
> doNothing, the object is suddenly of class Spatial, and is then returned
> as an object of class Spatial, which should never happen.
>
> For instance, I have a case where consistently
>
> setMethod("fullgrid", c("Spatial"),
> function(obj) { is(obj, "SpatialGrid") })

>> class(g)

> [1] "SpatialGrid"
> attr(,"package")
> [1] "sp"
>> fullgrid(g)

> [1] FALSE
>
> is obviously false, but in other cases it works fine.
>
> When I change the signature of doNothing to signature(object = "ANY",
> value = "ANY"), the problem disappears.
>
> I tried to make a self-contained example that reproduced the issue, but
> could only get something that worked as expected.
>
> I would appreciate any help or suggestions.
-- 
Edzer Pebesma
Institute for Geoinformatics (ifgi), University of Münster
Weseler Straße 253, 48151 Münster, Germany. Phone: +49 251
8333081, Fax: +49 251 8339763  http://ifgi.uni-muenster.de
http://www.52north.org/geostatistics      e.pebesma@wwu.de

______________________________________________
R-devel_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
Received on Sun 18 Sep 2011 - 10:35:36 GMT

This quarter's messages: by month, or sorted: [ by date ] [ by thread ] [ by subject ] [ by author ]

All messages

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Mon 19 Sep 2011 - 05:40:31 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-devel. Please read the posting guide before posting to the list.

list of date sections of archive