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), ...)
})
## Test
foo(1:4)
foo(matrix(1:4, 1, 4))
foo(array(1:4, c(1, 4, 1)))
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)))
>
> ----------------------------------------------------------
> SIGSIG -- signature too long (core dumped)
>
> ______________________________________________
> R-help at 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
>