當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。