# [R] S4 method dispatch matrixOrArray

Paul Roebuck roebuck at mdanderson.org
Wed Apr 12 21:07:04 CEST 2006

```On Wed, 12 Apr 2006, Gabor Grothendieck wrote:

> On 4/12/06, Paul Roebuck <roebuck at mdanderson.org> wrote:
>
> > I have some code where the primary dispatching is on
> > other parameters so I'd like not to have to create a
> > set of functions for "matrix" and another duplicate
> > set for "array". But the class union technique isn't
> > working as implemented below and I don't have my Green
> > book with me. How do I fix my infinite recursion problem?
> >
> >
> > ##--------------------------------------------------------
> > library(methods)
> >
> > setGeneric("foo",
> >           function(A, ...) {
> >               cat("generic", match.call()[[1]], "\n")
> >               standardGeneric("foo")
> >           })
> >
> > setMethod("foo",
> >          signature(A = "vector"),
> >          function(A, ...) {
> >              callGeneric(matrix(A, nrow = 1), ...)
> >          })
> >
> > setClassUnion("matrixOrArray", c("matrix", "array"))
> >
> > setMethod("foo",
> >          signature(A = "matrixOrArray"),
> >          function(A, ...) {
> >              cat("A =", A, "\n")
> >          })
> >
> > ## Test
> > foo(1:4)
> > foo(matrix(1:4, 1, 4))
> > foo(array(1:4, c(1, 4, 1)))
>
> I think its good enough to just define an array method, i.e. you
> don't need the matrix method or the matrixOrArray class, and the
> vector method can call foo(matrix(A,1), ...) so:
>
> setGeneric("foo",
>           function(A, ...) {
>               cat("generic", match.call()[[1]], "\n")
>               standardGeneric("foo")
>           })
>
> setMethod("foo",
>          signature(A = "array"),
>          function(A, ...) {
>              cat("A =", A, "\n")
>          })
>
> setMethod("foo",
>          signature(A = "vector"),
>          function(A, ...) {
>              foo(matrix(A, nrow = 1), ...)
>          })

Something didn't seem right here. That was pretty close
to what I had started with, before trying to go the
classUnion route. Matter of fact, the vector method can
retain use of callGeneric.

The solution has to do with the order in which calls to
setMethod are made. Adding foo-vector after foo-array
works fine; the other way around causes infinite recursion.

----------------------------------------------------------
SIGSIG -- signature too long (core dumped)

```