From sfalcon at fhcrc.org  Thu May 11 02:16:49 2006
From: sfalcon at fhcrc.org (Seth Falcon)
Date: Wed, 10 May 2006 17:16:49 -0700
Subject: [Rd] S4 initialize methods, unexpected recursive callNextMethod
Message-ID: <m2lkt9l8jy.fsf@ziti.local>

Hi,

Given a simple three class hierarchy: A <-- B <-- C

I want to define an initialize method for each class such that when I
call new("C", x=5), the initialize methods for A and B are used to
incrementally build the object.

When I do what seems obvious to me using callNextMethod, I get an
infinite recursion.  An example follows...

setClass("A", representation(a="numeric"))
setClass("B", representation(b="numeric"), contains="A")
setClass("C", representation(c="numeric"), contains="B")

setMethod("initialize", signature(.Object="A"),
          function(.Object, x) {
              cat("in A\n")
              .Object at a <- x
              .Object
          })

setMethod("initialize", signature(.Object="B"),
          function(.Object, x) {
              cat("in B\n")
              .Object <- callNextMethod(.Object=.Object, x=x)
              .Object at b <- .Object at a + 1
              .Object
          })

setMethod("initialize", signature(.Object="C"),
          function(.Object, x) {
              cat("in C\n")
              .Object <- callNextMethod(.Object=.Object, x=x)
              .Object at c <- .Object at a + .Object at b + 1
              .Object
          })


## Works as I am expecting for B
> myB <- new("B", 4)
in B
in A

## When you create a C, the B method gets called but the appropriate
## next method info seems lost and we end up back in C's method ?!
> myC <- new("C", 5)
in C
in B
in C
in B
in C
  C-c C-c

Should this work?  Is there a better way to organize the initializers
for a simple hierarchy (perhaps assume that args to the initializers
are not the same for A, B, and C).

Thanks,

+ seth



[Rd] S4 initialize methods, unexpected recursive callNextMethod
Seth Falcon