【发布时间】:2021-04-25 15:27:59
【问题描述】:
自从我第一次在 Advanced R 上阅读 Promise 以来,我一直在努力解决它的应用问题。有人提到,Promise 是一种支持惰性求值的数据结构。惰性求值的概念非常清楚,因为函数参数仅在被访问时才被求值。但是,在某些示例中,我只是无法发现 Promise 的存在以及如何/在何处评估它。考虑一下 Advanced R 中的以下示例:
y <- 10
h02 <- function(x) {
y <- 100
x + 1
}
h02(y)
[1] 11
它返回 11 而不是 101,显然,当我们将全局环境中已经存在的 y 之类的变量分配给 x 时,它会在函数外部绑定和评估。
所以我想知道一个承诺总是涉及某种赋值,或者每个表达式都可能是一个承诺,以及我们如何检测它们的存在。
提到它们是在函数的调用环境中评估的。所以第二个问题是他们的评估环境与普通参数不同,因为用户定义的参数是在函数之外评估的。
还有一个例子我不明白为什么它涉及惰性评估,我们只看到一次Calculating...。
double <- function(x) {
message("Calculating...")
x * 2
}
h03 <- function(x) {
c(x, x)
}
h03(double(20))
Calculating...
[1] 40 40
如果我在这里听起来有点困惑,我很抱歉,我明白了这一点,但它从来没有完全深入,我想寻求一点解释,对此我非常感激。
非常感谢您
【问题讨论】:
-
我不确定我是否明白你在这里问什么。 Promise 确实知道它们是在什么环境中创建并在那里进行评估的。没有基本的 R 方法来检查某个东西是否是一个承诺,因为一旦你看到它,它就会被评估并且不再是一个承诺。一个promise 永远不会被多次评估。 Promise 更多的是实现细节,而不是你直接使用的东西。
-
感谢您的回复。我理解,只是有时我无法解释它们以及它们是如何发生的,例如我想知道为什么我的第二个示例是一个承诺,因此只评估了一次。
标签: r promise lazy-evaluation