R语言
delayedAssign
位于 base
包(package)。 说明
delayedAssign
创建一个承诺如果请求其值,则评估给定表达式。这提供了直接访问惰性评估使用的机制R用于评估(解释的)函数。
用法
delayedAssign(x, value, eval.env = parent.frame(1),
assign.env = parent.frame(1))
参数
x |
变量名(在函数调用中以带引号的字符串形式给出) |
value |
要分配给 |
eval.env |
评估 |
assign.env |
分配 |
细节
eval.env
和 assign.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 deparse 表达式解析
- R deparseOpts 表达式解析选项
- R debug 调试函数
- R det 计算矩阵的行列式
- R detach 从搜索路径中分离对象
- R dump R 对象的文本表示
- R diag 矩阵对角线
- R dots ...、..1 等在函数中使用
- R do.call 执行函数调用
- R dcf 以 DCF 格式读写数据
- R data.class 对象类
- R dimnames 对象的暗名称
- R dyn.load 对外函数接口
- R diff 滞后差异
- R dput 将对象写入文件或重新创建它
- R duplicated 确定重复元素
- R dim 物体的尺寸
- R dontCheck 抑制检查的身份函数
- R drop 删除冗余盘区信息
- R difftime 时间间隔/差异
- R data.frame DataFrame
- R double 双精度向量
- R data.matrix 将 DataFrame 转换为数字矩阵
- R date 系统日期和时间
- R droplevels 删除因子中未使用的级别
注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Delay Evaluation and Promises。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。