Re: [R] Can you recover default argument values of a function?

From: Peter Dalgaard <p.dalgaard_at_biostat.ku.dk>
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.