[R] The evaluation of optional function arguments

Sietse Brouwer sbbrouwer+r-help at gmail.com
Mon Oct 20 12:48:46 CEST 2008

Hullo all,

 [***recap of the question: passing bar=harry fails when bar is among
 the ... args.]
 callTimes <- function(tom, harry) {

    timesDefineInside(foo=tom, bar=harry

timesDefineInside <- function(foo, ...) {
    foo * bar
 callTimes(3, 4)
 # Error: object "bar" not found
 [***end recap]

 On 20/10/2008, hadley wickham <h.wickham at gmail.com> wrote:
 > Why don't you want to do this?
 >  timesDefineInside <- function(foo, bar...) {
 >    foo * bar
 >  }

You're right that's it the obvious solution — the thing is, I'm
 hacking on somebody else's function, and in the interim I want to
 maintain backward compatibility. Part of that is expecting the same
 set of formals, so any extra arguments (in this case, 'bar' is
 actually 'experimentalMode') have to come throught the dots.

 Kaom Te wrote:
 > Try this for timesDefineInside:
 > timesDefineInside <- function(foo, ...) {
 >    extra.args <-   list(...)
 >    bar <- extra.args$bar
 >    foo * bar
 > }

Ah, that works! Apparently, there's a difference between
 list(...) and
 match.call(expand.dots=FALSE)$...   # wrapped in eval() or not.
 That makes sense, though, as the first will have evaluated bar=harry
 at the moment of calling, within the calling function, while the
 second will evaluated bar=harry within the called function. I think.

 Thank you both very much; and thanks, too, to Martin Morgan, who
 replied off-list pointing me at
 bar <- eval.parent(match.call()$bar)

 Grateful regards,

 Sietse Brouwer


Sietse Brouwer -- sbbrouwer at gmail.com -- +31 6 13456848
 Wildekamp 32 -- 6721 JD Bennekom -- the Netherlands
 MSN: sietse at gawab.com -- ICQ: 341232104

More information about the R-help mailing list