当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R delayedAssign 延迟评估和承诺


R语言 delayedAssign 位于 base 包(package)。

说明

delayedAssign创建一个承诺如果请求其值,则评估给定表达式。这提供了直接访问惰性评估使用的机制R用于评估(解释的)函数。

用法

delayedAssign(x, value, eval.env = parent.frame(1),
              assign.env = parent.frame(1))

参数

x

变量名(在函数调用中以带引号的字符串形式给出)

value

要分配给x的表达式

eval.env

评估 value 的环境

assign.env

分配 x 的环境

细节

eval.envassign.env 都默认为当前活动环境。

delayedAssign 分配给 Promise 的表达式在最终为 ‘forced’ 之前不会被计算。当第一次访问变量时会发生这种情况。

当承诺最终被强制执行时,它会在 eval.env 指定的环境中进行评估(其内容可能同时已更改)。之后,该值将被固定,并且不会再次计算表达式,其中 Promise 仍保留其表达式。

调用此函数是因为它的副作用,即将评估 value 的承诺分配给变量 x

例子

msg <- "old"
delayedAssign("x", msg)
substitute(x) # shows only 'x', as it is in the global env.
msg <- "new!"
x # new!

delayedAssign("x", {
    for(i in 1:3)
        cat("yippee!\n")
    10
})

x^2 #- yippee
x^2 #- simple number

ne <- new.env()
delayedAssign("x", pi + 2, assign.env = ne)
## See the promise {without "forcing" (i.e. evaluating) it}:
substitute(x, ne) #  'pi + 2'


### Promises in an environment [for advanced users]:  ---------------------

e <- (function(x, y = 1, z) environment())(cos, "y", {cat(" HO!\n"); pi+2})
## How can we look at all promises in an env (w/o forcing them)?
gete <- function(e_) {
   ne <- names(e_)
   names(ne) <- ne
   lapply(lapply(ne, as.name),
          function(n) eval(substitute(substitute(X, e_), list(X=n))))
}
(exps <- gete(e))
sapply(exps, typeof)

(le <- as.list(e)) # evaluates ("force"s) the promises
stopifnot(identical(le, lapply(exps, eval))) # and another "Ho!"

也可以看看

substitute ,如果 assign.env 不是 .GlobalEnv ,则查看与 Promise 关联的表达式。

相关用法


注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Delay Evaluation and Promises。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。