From ellis at stat.harvard.edu  Fri Mar 25 22:34:24 2005
From: ellis at stat.harvard.edu (Byron Ellis)
Date: Fri Mar 25 22:34:48 2005
Subject: [Rd] S4 methods semantics questions
In-Reply-To: <42442D8F.9040807@R-project.org>
References: <422af62516432df52f025c8bf6d3e48c@stat.harvard.edu>
	<42442D8F.9040807@R-project.org>
Message-ID: <46767a5bec481a68b90ca48706db36ee@stat.harvard.edu>


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@stat.harvard.edu)
>> "Oook" -- The Librarian
>> ______________________________________________
>> R-devel@stat.math.ethz.ch mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>
---
Byron Ellis (ellis@stat.harvard.edu)
"Oook" -- The Librarian


[Rd] S4 methods semantics questions
Byron Ellis