[Rd] S4 methods semantics questions
Byron Ellis
ellis at stat.harvard.edu
Fri Mar 25 22:34:24 CET 2005
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 (ellis at stat.harvard.edu)
>> "Oook" -- The Librarian
>> ______________________________________________
>> R-devel at stat.math.ethz.ch mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>
---
Byron Ellis (ellis at stat.harvard.edu)
"Oook" -- The Librarian
More information about the R-devel
mailing list