Message-ID: <70814.1360928108@greg-minshalls-mbp.local>
Date: 2013-02-15T11:35:08Z
From: Greg Minshall
Subject: 2 setGeneric's, same name, different method signatures
In-Reply-To: Your message of "Thu, 14 Feb 2013 18:43:43 -0800." <511DA0DF.5040207@fhcrc.org>
Martin,
fantastic. thank you *very* much! that clears lots of things up for
me.
(for the record: i think that setGeneric overwriting a previous is more
surprising -- thus violating the principle of least surprise -- than one
function overwriting a previous, in that we think of (or, one way to
think of) OOP is that, after finagling to have no clashes on *class*
names, we should not worry about other than intra-class name clashes.
as i said, for the record.)
thanks again.
cheers, Greg
----
Martin Morgan <mtmorgan at fhcrc.org> wrote:
>
> Hi Greg --
>
> this setGeneric is over-writing the first, as would
>
> f = function() "first"
> f = function() "second"
> f() # "second"
>
> If you'd like to dispatch on a single argument, then
>
> setGeneric("one", function(x, ...) standardGeneric("one"))
> setMethod("one", "A", function(x, ...) "A-method")
> setMetohd("one", "B", function(x, y, ...) "B-method")
>
> The '...' in the generic allow you to add arguments that are 'picked
> off' by methods. The user could provide any value for y, not only an
> object of class "B".
>
> If you'd like to dispatch sometimes on two arguments then
>
> setGeneric("two", function(x, y, ...) standardGeneric("two"))
> setMethod("two", c("A", "ANY"), function(x, y, ...) "A,ANY-method")
> setMethod("two", c("B", "B"), function(x, y, ...) "B,B-method")
>
> then two(new("A")), two(new("A"), new("A")) and two(new("A"),
> new("B")) end up in A,ANY,two-method while two(new("B"), new("B"))
> ends up in "B,B,two-method". Other combinations are errors. One might
> instead not define A,ANY but instead
>
> setMethod("two", c("A", "missing"), function(x, y, ...) "A,missing-method")
>
> and then two(new("A"), new("A")) would be an error.
>
> Multiple dispatch is complicated, and perhaps best to avoid if possible.
>
> It's possible to write a generic and methods that dispatch on '...',
> with the requirement that all classes are the same; this in the spirit
> of comparing two B's and returning the smaller; see ?dotsMethods
> though again this is not a trivial use case.
>
> Hope that helps enough.
>
> Martin