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
______________________________________________
[email protected] 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.