On 27/08/2007 5:47 PM, Faheem Mitha wrote: > Just wondered about this curious behaviour. I'm trying to learn about > classes. Basically setMethod works the first time, but does not seem to > work the second time. > Faheem. > ************************************************************************* > setClass("foo", representation(x="numeric")) > > bar <- function(object) > { > return(0) > } > > bar.foo <- function(object) > { > print([EMAIL PROTECTED]) > } > setMethod("bar", "foo", bar.foo)
This changes the definition of bar: now it becomes a generic function instead of a simple function. > > bar(f) > > # bar(f) gives 1. (You forgot the f = new("foo", x= 1) line, but that's somewhat obvious.) > > bar <- function(object) > { > return(0) > } Now bar is a regular function again. > > bar.foo <- function(object) > { > print([EMAIL PROTECTED]) > } > setMethod("bar", "foo", bar.foo) Now the generic would call that method, but you've wiped out the generic. > > f = new("foo", x= 1) > > bar(f) > > # bar(f) gives 0, not 1. The problem is that setting a method on a regular function automagically creates a generic for it, but redefining a function doesn't remove the generic. It's still there, somewhere in R's insides, and if you could find it to call it your method would get called. But you're calling the plain old bar() instead. This behaviour makes more sense if you think about generics in other packages. There's a generic called "show" in the methods package. But you can define your own function called "show", and in your workspace, you'd want to call that, not the one from methods. I'd recommend using setGeneric() to create a generic, rather than depending on the automatic creation, to avoid this kind of confusion. Duncan Murdoch ______________________________________________ R-help@stat.math.ethz.ch mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.