Talbot Katz wrote:
> Thank you, that's just what I wanted.  By the way, I found an interesting 
> "gotcha" that can occur with expression arguments:
>
>   
>> x = 7
>> z = 2
>> mxy <- function( x = 4, y = x + z ) { return(x*y) }
>> eval( formals( mxy )[[1]] )
>>     
> [1] 4
>   
>> eval( formals( mxy )[[2]] )
>>     
> [1] 9
>   
>> mxy()
>>     
> [1] 24
>   
>> mxy( eval( formals( mxy )[[1]] ), eval( formals( mxy )[[2]] ) )
>>     
> [1] 36
>   
>
> The problem is "confusion" about whether the "x" in the second argument 
> expression refers to the first argument, or the environment variable.  When 
> the function is evaluated, the argument value of x is used, but when the 
> argument is evaluated (using eval and formals) the environment value of x is 
> used.  This is a reasonable choice, and mixing up arguments and environment 
> variables in a function definition probably should be considered bad 
> programming.
>
>   
Yes, argument expressions are always evaluated in the evaluation frame 
of the function. Sometimes they even refer to quantities computed well 
into the evaluation of the function, like "p" in

 > anova.mlm
function (object, ..., test = c("Pillai", "Wilks", "Hotelling-Lawley",
    "Roy", "Spherical"), Sigma = diag(nrow = p), T = Thin.row(proj(M) -
    proj(X)), M = diag(nrow = p), X = ~0, idata = data.frame(index = 
seq_len(p)))
.....
        p <- ncol(SSD(object)$SSD)
.....

(p is the dimension of the covariance matrix, aka the number of columns 
in the response matrix. It makes no sense to pass it as a separate 
parameter, and obtaining it via extraction from "object" is kludgy and 
inefficient as it is needed three times.)

Another gotcha is if you modify a variable referred to in a default 
expression before using the expression.

The upshot is that you pretty much cannot in general figure out what the 
argument defaults will evaluate to without actually running the function.


-- 
   O__  ---- Peter Dalgaard             Ă˜ster Farimagsgade 5, Entr.B
  c/ /'_ --- Dept. of Biostatistics     PO Box 2099, 1014 Cph. K
 (*) \(*) -- University of Copenhagen   Denmark          Ph:  (+45) 35327918
~~~~~~~~~~ - ([EMAIL PROTECTED])                  FAX: (+45) 35327907

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to