gpt4 book ai didi

r - 嵌套的 `eval` 的环境和外壳是什么?

转载 作者:行者123 更新时间:2023-12-04 17:35:35 24 4
gpt4 key购买 nike

背景

我正在为 lambdas 创建快捷方式,因为 function (…) … 的重复使用使我的代码相当困惑。作为补救措施,我正在尝试受其他语言(例如 Haskell)启发的替代语法,只要在 R 中是可能的。简化后,我的代码如下所示:

f <- function (...) {
args <- match.call(expand.dots = FALSE)$...
last <- length(args)
params <- c(args[-last], names(args)[[last]])

function (...)
eval(args[[length(args)]],
envir = setNames(list(...), params),
enclos = parent.frame())
}

这允许以下代码:
f(x = x * 2)(5)       # => 10
f(x, y = x + y)(1, 2) # => 3

等等。

当然,真正的目的是将它与高阶函数一起使用1:
Map(f(x = x * 2), 1 : 10)

问题

不幸的是,我有时不得不嵌套高阶函数,然后它停止工作:
f(x = Map(f(y = x + y), 1:2))(10)

产生“错误 eval(expr, envir, enclos) : 对象 x未找到”。使用 function 的概念等效代码而不是 f作品。此外,其他嵌套方案也适用:
f(x = f(y = x + y)(2))(3) # => 5

我怀疑罪魁祸首是嵌套 f 的父环境 map 内部:是顶层环境而不是外部 f的。但是我不知道如何解决这个问题,而且上面的第二种情况也让我感到困惑。相关问题 ( such as this one ) 提出了不适用于我的情况的解决方法。

很明显,我对 R 中的环境的理解存在差距。我想要的可能吗?

1 当然,这个例子可以简单地写成 (1 : 10) * 2 .真正的应用是更复杂的对象/操作。

最佳答案

答案是附上parent.frame()到输出函数的环境:

f <- function (...) {
args <- match.call(expand.dots = FALSE)$...
last <- length(args)
params <- c(args[-last], names(args)[[last]])

e <- parent.frame()

function (...)
eval(args[[length(args)]],
envir = setNames(list(...), params),
enclos = e)
}

希望有人能很好地解释为什么这有效而不是你的。随意编辑。

关于r - 嵌套的 `eval` 的环境和外壳是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20597055/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com