使用do.call将函数参数传递给其他函数

时间:2013-10-20 17:39:30

标签: r environment do.call

我想将对象met向下传递给函数sf但是找不到对象错误。我认为它可能与top函数调用的环境有关,它没有传递给子函数:

f <- function(fname,x,met=c('sum','subs')){

  .env <- environment() ## identify the environment
  do.call(fname,list(x,met),envir=.env)

}

sf <- function(x,...){

  if (met== 'sum') x + 100 else x - 100

}

f('sf',1:10,met='sum')

1 个答案:

答案 0 :(得分:4)

met如果未sf明确作为sf的参数传递,则sf <- function(x, met, ...) { if (met == 'sum') x + 100 else x - 100 } 正文中的名称无法引用,请尝试以下操作:

met

如果我们假设...是调用sfsf <- function(x, ...) { met <- list(...)[[1]] if (met == 'sum') x + 100 else x - 100 } 的第一个组成部分(问题示例中的情况),那么这也适用:

sf <- function(x, ...) {
  met <- ...[[1]]
  if (met == 'sum') x + 100 else x - 100
}

这个更简洁的替代方案也有效:

sf <- function(x, ...) {
  met <- ..1
  if (met == 'sum') x + 100 else x - 100
}

更简洁的是这个替代方案:

env

我们在这里do.call并不需要{{1}}参数。

更新:更正。