Hi Dr Lumley,

Thanks to you and Dr. Murdoch for your helpful explanations. See below.

On Mon, 27 Aug 2007, Thomas Lumley wrote:

On Mon, 27 Aug 2007, Faheem Mitha wrote:

setClass("foo", representation(x="numeric"))

bar <- function(object)
  {
    return(0)
  }

bar.foo <- function(object)
  {
    print([EMAIL PROTECTED])
  }
setMethod("bar", "foo", bar.foo)

bar(f)

# bar(f) gives 1.

Not for me. It gives
bar(f)
Error: object "f" not found
Error in bar(f) : error in evaluating the argument 'object' in selecting a
method for function 'bar'

However, if I do
f = new("foo", x= 1)
first, it gives 1.

bar <- function(object)
  {
    return(0)
  }

Here you have masked the generic bar() with a new function bar(). Redefining bar() is the problem, not the second setMethod().

bar.foo <- function(object)
  {
    print([EMAIL PROTECTED])
  }
setMethod("bar", "foo", bar.foo)

Because there was a generic bar(), even though it is overwritten by the new bar(), setMethod() doesn't automatically create another generic.

f = new("foo", x= 1)

bar(f)

# bar(f) gives 0, not 1.


Because bar() isn't a generic function
bar
function(object)
  {
    return(0)
  }


If you had used setGeneric() before setMethod(), as recommended, your example would have done what you expected, but it would still have wiped out any previous methods for bar() -- eg, try setMethod("bar","baz", function(object) print("baz")) before you redefine bar(), and notice that getMethod("bar","baz") no longer finds it.

Actually, it does not appear to be wiped. getMethod finds the "baz" version and the "foo" version, but it seems to use the default even for foo, which is of course wrong. Am I missing something? See below. Thanks.

I do get this warning message. Don't know what it means, though.

Warning message:
in the method signature for function "bar" no definition for class: “baz” in: matchSignature(signature, fdef, where)

                                                                   Faheem.
****************************************************************************
setClass("foo", representation(x="numeric"))

bar <- function(object)
  {
    return(0)
  }

setGeneric("bar")

bar.foo <- function(object)
  {
    print([EMAIL PROTECTED])
  }

setMethod("bar", "foo", bar.foo)

setMethod("bar", "baz", function(object) print("baz"))

bar <- function(object)
  {
    return(0)
  }

bar.foo <- function(object)
   {
    print([EMAIL PROTECTED])
   }
setMethod("bar", "foo", bar.foo)

f = new("foo", x= 1)
bar(f) # returns 0

*****************************************************************
getMethod("bar", "baz")
Method Definition:

function (object)
print("baz")

Signatures:
        object
target  "baz"
defined "baz"

getMethod("bar", "foo")
Method Definition:

function (object)
{
    print([EMAIL PROTECTED])
}

Signatures:
        object
target  "foo"
defined "foo"
______________________________________________
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.

Reply via email to