将所有参数传递给另一个函数

时间:2019-06-28 17:32:23

标签: r

我希望能够将一个函数中的当前参数传递给另一个函数,而不必单独列出每个参数。这是针对稍微复杂一点的函数,它将具有大约15个参数,以后可能添加更多的参数(它基于用于数据的API,该API稍后可能会添加更复杂的数据):

f_nested <- function(a, b, ...) {
  c <- a + b
  return(c)
}

f_main <- function(a, b) {

  d <- do.call(f_nested, as.list(match.call(expand.dots = FALSE)[-1]))

  c <- 2 / d

  return(c)
}

f_main(2, 3)
#> [1] 0.4

sapply(2:4, function(x) f_main(x, 4))
#> Error in (function (a, b, ...) : object 'x' not found

reprex package(v0.3.0)于2019-06-28创建

第一次调用f_main(2,3)会产生预期的结果。但是,当使用sapply遍历值的向量时,会出现一个错误,即找不到对象。我怀疑我的match.call()使用不正确,并且希望能够遍历我的函数。

1 个答案:

答案 0 :(得分:1)

我将从lm所用的match.call中借用,用下一个函数替换第一个元素。我认为一个关键是用eval来调用parent.frame(),这样x才能得到正确解决。

# no change
f_nested <- function(a, b, ...) {
  c <- a + b
  return(c)
}
# changed, using `eval` instead of `do.call`, reassigning the function name
f_main <- function(a, b) {
  thiscall <- match.call(expand.dots = TRUE)
  thiscall[[1]] <- as.name("f_nested")
  d <- eval(thiscall, envir = parent.frame())
  c <- 2 / d
  return(c)
}
sapply(2:4, function(x) f_main(x, 4))
# [1] 0.3333333 0.2857143 0.2500000

如@MrFlick所建议,可以使用以下方法将其略微缩短:

f_main <- function(a, b) {
  thiscall <- match.call(expand.dots = TRUE)
  thiscall[[1]] <- as.name("f_nested")
  d <- eval.parent(thiscall)
  c <- 2 / d
  return(c)
}