eval 位於 base 包(package)。 說明
評估一個R特定環境下的表達。
用法
eval(expr, envir = parent.frame(),
           enclos = if(is.list(envir) || is.pairlist(envir))
                       parent.frame() else baseenv())
evalq(expr, envir, enclos)
eval.parent(expr, n = 1)
local(expr, envir = new.env())
參數
| expr | 一個要評估的對象。查看具體信息'。 | 
| envir | 
 | 
| enclos | 相關時 | 
| n | 要返回的父代數量 | 
細節
eval 在 envir 指定的環境中計算 expr 參數並返回計算值。如果未指定 envir,則默認值為 parent.frame()(調用 eval 的環境)。
要評估的對象可以是 call 或 expression 或 name 類型(當在當前作用域中查找名稱並評估其綁定時)、promise 或任何基本類型(例如向量) 、函數和環境(原樣返回)。
evalq 形式相當於 eval(quote(expr), ...) 。 eval 在將其傳遞給求值器之前先求值當前作用域中的第一個參數:evalq 避免了這種情況。
eval.parent(expr, n) 是 eval(expr, parent.frame(n)) 的簡寫。
如果 envir 是列表(例如數據幀)或配對列表,則將其複製到臨時環境(帶有附件 enclos ),並使用臨時環境進行評估。因此,如果 expr 更改(對)列表中指定的任何組件,則更改將丟失。
如果 envir 是 NULL ,它會被解釋為空列表,因此在 envir 中找不到任何值,而 look-up 會直接轉到 enclos 。
local 在本地環境中計算表達式。它相當於evalq,隻不過它的默認參數創建了一個新的空環境。這對於創建匿名遞歸函數和作為一種有限的命名空間函數很有用,因為環境中定義的變量從外部不可見。
值
評估對象的結果:對於表達式向量,這是評估最後一個元素的結果。
注意
由於範圍規則的不同,兩者之間存在一些差異R和S在這個區域。特別是,S 中的默認封裝是全局環境。
當評估作為參數傳遞給函數的數據幀中的表達式時,相關的封裝通常是調用者的環境,即需要 eval(x, data, parent.frame()) 。
例子
eval(2 ^ 2 ^ 3)
mEx <- expression(2^2^3); mEx; 1 + eval(mEx)
eval({ xx <- pi; xx^2}) ; xx
a <- 3 ; aa <- 4 ; evalq(evalq(a+b+aa, list(a = 1)), list(b = 5)) # == 10
a <- 3 ; aa <- 4 ; evalq(evalq(a+b+aa, -1), list(b = 5))        # == 12
ev <- function() {
   e1 <- parent.frame()
   ## Evaluate a in e1
   aa <- eval(expression(a), e1)
   ## evaluate the expression bound to a in e1
   a <- expression(x+y)
   list(aa = aa, eval = eval(a, e1))
}
tst.ev <- function(a = 7) { x <- pi; y <- 1; ev() }
tst.ev()  #-> aa : 7,  eval : 4.14
a <- list(a = 3, b = 4)
with(a, a <- 5) # alters the copy of a from the list, discarded.
##
## Example of evalq()
##
N <- 3
env <- new.env()
assign("N", 27, envir = env)
## this version changes the visible copy of N only, since the argument
## passed to eval is '4'.
eval(N <- 4, env)
N
get("N", envir = env)
## this version does the assignment in env, and changes N only there.
evalq(N <- 5, env)
N
get("N", envir = env)
##
## Uses of local()
##
# Mutually recursive.
# gg gets value of last assignment, an anonymous version of f.
gg <- local({
    k <- function(y)f(y)
    f <- function(x) if(x) x*k(x-1) else 1
})
gg(10)
sapply(1:5, gg)
# Nesting locals: a is private storage accessible to k
gg <- local({
    k <- local({
        a <- 1
        function(y){print(a <<- a+1);f(y)}
    })
    f <- function(x) if(x) x*k(x-1) else 1
})
sapply(1:5, gg)
ls(envir = environment(gg))
ls(envir = environment(get("k", envir = environment(gg))))
參考
Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988)
The New S Language.
Wadsworth & Brooks/Cole.  (eval only.)
也可以看看
expression、quote、sys.frame、parent.frame、environment。
此外,force 強製評估,通常是函數參數。
相關用法
- R environment 環境接入
- R exists 是否已定義對象?
- R eapply 將函數應用於環境中的值
- R expand.grid 從因子變量的所有組合創建 DataFrame
- R expression 未計算的表達式
- R eigen 矩陣的譜分解
- R encodeString 對字符向量進行編碼以供打印
- R extSoftVersion 第三方軟件的報告版本
- R file.path 構造文件路徑
- R grep 模式匹配和替換
- R getwd 獲取或設置工作目錄
- R vector 向量 - 創建、強製等
- R lapply 對列表或向量應用函數
- R dump R 對象的文本表示
- R Sys.getenv 獲取環境變量
- R rank 樣本排名
- R getDLLRegisteredRoutines DLL 中 C/Fortran 例程的反射信息
- R pushBack 將文本推回連接
- R strsplit 分割字符向量的元素
- R seq.Date 生成規則的日期序列
- R invisible 將打印模式更改為不可見
- R noquote “無引號”字符串打印類
- R warning 警告信息
- R rapply 遞歸地將函數應用於列表
- R basename 操作文件路徑
注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Evaluate an (Unevaluated) Expression。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。
