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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。