From: Peter Dalgaard <p.dalgaard_at_biostat.ku.dk>

Date: Thu, 27 Dec 2007 09:48:23 +0100

Date: Thu, 27 Dec 2007 09:48:23 +0100

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 ~~~~~~~~~~ - (p.dalgaard_at_biostat.ku.dk) FAX: (+45) 35327907 ______________________________________________ R-help_at_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.Received on Thu 27 Dec 2007 - 08:51:52 GMT

Archive maintained by Robert King, hosted by
the discipline of
statistics at the
University of Newcastle,
Australia.

Archive generated by hypermail 2.2.0, at Thu 27 Dec 2007 - 10:30:21 GMT.

*
Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help.
Please read the posting
guide before posting to the list.
*