【发布时间】:2018-02-06 20:54:20
【问题描述】:
在下面的代码中,我希望 f 和最后的 a 都返回 3。但实际上它们都返回 2。这是为什么呢?在评估 Promise 时,不是 3 替换了封闭环境中的 2 吗?
a <- 1
f <- function(a){
a <<- 3
cat(a)
}
f(a <- 2)
a
请注意,如果我在对 f 的调用中使用 = 而不是
【问题讨论】:
-
这是
=和<-之间存在差异的情况之一。如果在函数调用中使用了=,则将其视为命名参数。如果您只使用a<-2,那么它是一个未命名的参数,直到您运行cat(a),它才会在调用环境中进行评估,覆盖之前的全局分配。你真的想在这里做什么? -
扩展@MrFlick 的评论:如果您在调试
f的每一步运行get("a",envir = .GlobalEnv),您会看到它返回值1,然后是3,此时您只是即将评估cat(a)。评估首先找到 argument,而不是全局环境中的a,因此它在调用环境中评估a <- 2,因此再次将其覆盖为 2。 -
谢谢,乔兰,这很有帮助。所以我缺少的是,在 a 的承诺得到履行之前,不会在命令行中分配给 a 。我认为这仅适用于 = 的作业。我的意思是
-
Flick 先生,我正在努力克服我经常无法正确预测我编写的 R 代码会做什么的问题。我目前的策略是将功能评估过程分解为尽可能好的步骤(我已经 15 岁了,我认为我还没有全部完成),然后确保我真正理解每个步骤。在此过程中,我提出了很多关于该步骤的确切机制的问题,尝试验证机制的假设,并确定我仍然不了解的领域。但我仍然偶尔会遇到我不期望或不理解的结果
标签: r scope promise arguments lazy-evaluation