6

我有一个包装函数,我需要将可选参数传递给指定的子函数。但是有很多不同的可能子功能,我无法预先指定它们。作为参考,环境中存在子功能等......考虑:

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. 
4

2 回答 2

5

您需要将 to 传递...method.out. 然后它工作正常:

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
于 2013-08-19T21:40:15.980 回答
0

除了Thomas对 OP 问题的回答之外,您可能还必须转发一个可选参数,该参数是包装函数的显式参数。

在这种情况下,无需在包装器定义中重复包装函数的默认值,您可以使用它missing来构造一个缺少参数的调用。

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!
于 2018-01-15T16:58:23.133 回答