Re: [Rd] S4 methods semantics questions

From: Byron Ellis <>
Date: Fri 25 Mar 2005 - 21:34:24 GMT

On Mar 25, 2005, at 7:26 AM, John Chambers wrote:

> Byron Ellis wrote:
>> Some quick questions about S4 methods.
>> Does the typing of S4 methods mean that lazy evaluation is no longer
>> possible? It seems that you would need to evaluate the arguments to
>> determine their type at dispatch.
> Yes, it would be a neat trick to know the class of an actual argument
> without evaluating it ;-)

True enough. Though I suppose you could have done something with arguments that are method calls by inspecting valueClass to at least limit the set of possible types. :-)

> However, the evaluation proceeds stepwise until a unique method
> matches, so that arguments not needed to do the dispatch will not yet
> be evaluated. The order of evaluation is controlled by the signature
> of the generic, by default all the arguments in order, but specifiable
> via the signature= argument to setGeneric.
>> Second, what role, if any, do default arguments play in S4 methods? I
>> notice that you can put default arguments into generics but that the
>> dispatch is still done on the type of the calling argument rather
>> than the default argument, though the default arg is substituted.
> Yes, dispatch depends on the call, not on the default expressions for
> the arguments. If an actual argument is missing, the dispatch tries
> to match "missing" or "ANY".
>> However, default values for arguments in method definition seem to be
>> stripped or, more likely, overridden at dispatch by the calling
>> argument (i.e. "missing").
>> Some examples:
>> setGeneric("foo",function(x="bar") standardGeneric("foo"))
>> setMethod("foo","missing",function(x) print(x))
>> >foo()
>> [1] "bar"
>> setGeneric("foo",function(x,y) standardGeneric("foo"))
>> setMethod("foo","numeric",function(x,y=2) x+y)
>> >foo(1)
>> Error in foo(1) : argument "y" is missing, with no default
> Well, the intent is that defaults are indeed taken from the method, if
> there is a default there, otherwise from the generic. It looks as if
> there is a bug in the case that the generic has NO default for that
> argument (unless, of course, it's a subtle feature, but not that I can
> think of at the moment).
> Your example works as intended if there is a default expression for y
> in the generic:
> R> setGeneric("foo",function(x,y=stop("Need y"))
> standardGeneric("foo"))
> [1] "foo"
> R> setMethod("foo","numeric",function(x,y=2) x+y)
> [1] "foo"
> R> foo(1)
> [1] 3

Ah, interesting. I can't decide if thats a feature or a bug either :-)

>> ---
>> Byron Ellis (
>> "Oook" -- The Librarian
>> ______________________________________________
>> mailing list

Byron Ellis (
"Oook" -- The Librarian

______________________________________________ mailing list
Received on Sat Mar 26 08:38:52 2005

This archive was generated by hypermail 2.1.8 : Mon 24 Oct 2005 - 22:26:32 GMT