Daniel Egan
Daniel Egan

Reputation: 846

Passing optional arguments inside a wrapper function to a sub-function

I have a wrapper function, where I need to pass optional arguments to the sub-function specified. But there are so many different possible sub-functions that I can't pre-specify them. For reference, the sub-functions exist in the environment etc... Consider:

funInFun<- function (x, method, ...) {    

  method.out <- function(this.x, FUN, ...) {
    FUN <- match.fun(FUN)
    c <- FUN(this.x, ...)
    return(c)
  }

  d <- method.out(x, method)
  return(d)
}

data<-seq(1,10)
funInFun(data, mean) #  Works

data<-c(NA,seq(1,10))
funInFun(data, mean, na.rm=TRUE) # Should remove the NA

funInFun(c(seq(1,10)), quantile, probs=c(.3, .6))  # Shoudl respect the probs option. 

Upvotes: 6

Views: 2001

Answers (2)

jan-glx
jan-glx

Reputation: 9486

In addition to Thomas' answer to the OP's question you might have to forward an optional argument that is an explicit argument of the wrapper function.

In this case, instead of repeating the default value of the wrapped function in the wrapper definition you can use missing to construct a call with a missing argument.

f <- function(s = "world!") cat("Hello", s)
f()
# Hello world!
g <-  function(s = NULL) eval(substitute(
  f(s = sub_me), 
  list(sub_me = if(missing(s)) quote(expr =) else s)))
g()
# Hello world!
g("you!")
# Hello you!

Upvotes: 0

Thomas
Thomas

Reputation: 44525

You need to pass the ... to method.out. Then it works fine:

funInFun<- function (x, method, ...) {    

  method.out <- function(this.x, FUN, ...) {
    FUN <- match.fun(FUN)
    c <- FUN(this.x, ...)
    return(c)
  }

  d <- method.out(x, method, ...)  # <<--- PASS `...` HERE
  return(d)
}

data<-seq(1,10)
funInFun(data, mean) #  Works
# [1] 5.5    

data<-c(NA,seq(1,10))
funInFun(data, mean, na.rm=TRUE) # Should remove the NA
# [1] 5.5

funInFun(c(seq(1,10)), quantile, probs=c(.3, .6)) 
# 30% 60% 
# 3.7 6.4

Upvotes: 5

Related Questions