1

给定函数列表

functions <- list(f1,f2)

我想迭代地重新定义这个列表中的所有函数,以便我得到

newFunctions <- list(function(...){f1(...) + 1},function(...){f2(...) + 1})

我试图用

newFunctions <- lapply(functions, function(i){
  return(function(...){
    return(i(...) + 1)
    }
}

但这会硬编码i到函数中,而不是迭代器指向的函数中。

我发现R: Defining functions within a loop,解决方案是在定义函数之前评估迭代器。但是,我无法评估i,因为我正在迭代函数

有没有办法在 R 中实现这一点?

4

1 回答 1

1

首先让我们通过摆脱显式return调用来修复语法错误:

newFunctions <- lapply(functions, function(x) function(...) x(...) + 1)

使用示例:

functions <- list(sin, cos, tan)
newFunctions <- lapply(functions, function(x) function(...) x(...) + 1)
identical(
  newFunctions[[1]](1), 
  sin(1) + 1
)
#[1] TRUE

代码创建闭包。x取自相关环境:

newFunctions[[1]]
#function(...) x(...) + 1
#<environment: 0x000000001a812138>
environment(newFunctions[[1]])$x
#function (x)  .Primitive("sin")
于 2018-11-27T13:08:26.770 回答