0

我想将对象传递met给函数sf,但得到对象未找到错误。我认为它可能与未传递给子函数的顶级函数调用的环境有关:

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')
4

1 回答 1

4

metsf如果它没有作为参数显式传递,则不能在主体中按名称引用,sf因此请尝试以下操作:

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

如果我们假设是调用中met的第一个组件(如问题示例中的情况),那么这也有效:...sf

sf <- 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

更新:更正。

于 2013-10-20T17:58:07.767 回答