gpt4 book ai didi

r - 在 R 中使用带有高阶函数的 callCC

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

我试图弄清楚如何获得 R 的 callCC 函数,以便对函数进行短路评估,以便与 lapply 和 Reduce 等函数一起使用。

动机

这将使 Reduce 和 lapply 具有渐近效率 > O(n),通过允许您
提前退出计算。

例如,如果我在列表中搜索一个值,我可以在列表中映射一个 'finder' 函数,第二个发现 lapply 停止运行并返回该值(很像打破循环,或使用return 声明以尽早突破)。

问题是我无法使用 callCC 需要的样式编写 lapply 和 Reduce 应该采用的函数。

示例

假设我正在尝试编写一个函数来查找列表中的值“100”:相当于

imperativeVersion <- function (xs) {
for (val in xs) if (val == 100) return (val)
}

传递给 lapply 的函数如下所示:
find100 <- function (val) { if (val == 100) SHORT_CIRCUIT(val)  }
functionalVersion <- function (xs) lapply(xs, find100)

这(显然)崩溃了,因为还没有定义短路功能。
callCC( function (SHORT_CIRCUIT) lapply(1:1000, find100) )

问题是这也会崩溃,因为在定义 find100 时短路功能并不存在。我想让类似的东西起作用。

以下工作是因为 SHORT_CIRCUIT 是在创建传递给 lapply 的函数时定义的。
callCC(
function (SHORT_CIRCUIT) {
lapply(1:1000, function (val) {
if (val == 100) SHORT_CIRCUIT(val)
})
)

如何在传递给 lapply 的函数中定义 SHORT_CIRCUIT 而不像上面那样内联定义它?

我知道这个例子可以使用循环、减少或任何其他方式来实现。我正在寻找解决在 lapply 和 Reduce 中使用 callCC 的问题的具体方法。

如果我含糊不清或需要任何澄清,请在下面发表评论。我希望有人可以帮助解决这个问题:)

编辑一:
方法应该是“生产质量”;没有分离功能或类似的黑魔法。

最佳答案

我找到了这个问题的解决方案:

find100 <- function (val) {
if (val == 100) SHORT_CIRCUIT(val)
}

short_map <- function (fn, coll) {


callCC(function (SHORT_CIRCUIT) {

clone_env <- new.env(parent = environment(fn))
clone_env$SHORT_CIRCUIT <- SHORT_CIRCUIT

environment(fn) <- clone_env
lapply(coll, fn)

})
}

short_map(find100, c(1,2,100,3))

使高阶函数与 callCC 一起工作的技巧是在继续执行程序的其余部分之前将短路函数分配到输入函数环境中。我克隆了环境以避免意外的副作用。

关于r - 在 R 中使用带有高阶函数的 callCC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19430410/

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