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