| eval {base} | R Documentation |
Evaluate an R expression in a specified environment.
eval(expr, envir = parent.frame(),
enclos = if(is.list(envir) || is.pairlist(envir)) parent.frame())
evalq(expr, envir, enclos)
eval.parent(expr, n = 1)
local(expr, envir = new.env())
expr |
object of mode expression or call or
an “unevaluated expression”. |
envir |
the environment in which expr is to
be evaluated. May also be a list, a data frame, or an integer as in
sys.call. |
enclos |
Relevant when envir is a list or a data frame.
Specifies the
enclosure, i.e., where R looks for objects not found in
envir. |
n |
parent generations to go back |
eval evaluates the expression expr argument in the
environment specified by envir and returns the computed value.
If envir is not specified, then
sys.frame(sys.parent()), the environment where
the call to eval was made is used.
The evalq form is equivalent to eval(quote(expr), ...).
As eval evaluates its first argument before passing it to the
evaluator, it allows you to assign complicated expressions to symbols
and then evaluate them. evalq avoids this.
eval.parent(expr, n) is a shorthand for eval(expr,
parent.frame(n)).
local evaluates an expression in a local environment. It is
equivalent to evalq except the its default argument creates a
new, empty environment. This is useful to create anonymous recursive
functions and as a kind of limited namespace feature since variables
defined in the environment are not visible from the outside.
Due to the difference in scoping rules, there are some differences between R and S in this area. In particular, the default enclosure in S is the global environment.
When evaluating expressions in data frames that has been passed as
argument to a function, the relevant enclosure is often the caller's
environment, i.e., one needs
eval(x, data, parent.frame()).
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.
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
##
## Uses of local()
##
# Mutual recursives.
# 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))))