【问题标题】:R: Iteratively Defining functions inside functionsR:在函数内部迭代地定义函数
【发布时间】:2023-04-09 05:03:01
【问题描述】:

给定一个函数列表

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 中实现这个?

【问题讨论】:

  • 你的问题开始时我已经遇到了问题。您在那里显示的不是功能列表。它是这些函数的返回值的列表。
  • 可能类似于functions &lt;- list(sin, cos, tan); lapply(functions, function(x) function(...) x(...) + 1)
  • @mtoller 名称x 是硬编码的,但newFunctions[[1]](x)1 + sin(x) 的结果是identical
  • 我的代码创建了闭包。 x = sin 在函数的关联环境中定义。这是我看到的将任意函数列表作为输入的唯一方法。如果你有一个闭包列表或一个表达式列表,那么替代方案是可能的。
  • 看看e &lt;- environment(newFunctions[[1]]); e$i返回什么。

标签: r function loops function-definition


【解决方案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-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多