Rev 10603 | Rev 24679 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
\name{eval}\alias{eval}\alias{evalq}\alias{eval.parent}\alias{local}\title{Evaluate an (Unevaluated) Expression}\description{Evaluate an \R expression in a specified environment.}\usage{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())}\arguments{\item{expr}{object of mode \code{\link{expression}} or\code{call} oran ``unevaluated expression''.}\item{envir}{the \code{\link{environment}} in which \code{expr} is tobe evaluated. May also be a list, a data frame, or an integer as in\code{sys.call}.}\item{enclos}{Relevant when \code{envir} is a list or a data frame.Specifies theenclosure, i.e., where \R looks for objects not found in\code{envir}.}\item{n}{parent generations to go back}}\details{\code{eval} evaluates the expression \code{expr} argument in theenvironment specified by \code{envir} and returns the computed value.If \code{envir} is not specified, then\code{\link{sys.frame}(\link{sys.parent}())}, the environment wherethe call to \code{eval} was made is used.The \code{evalq} form is equivalent to \code{eval(quote(expr), \dots)}.As \code{eval} evaluates its first argument before passing it to theevaluator, it allows you to assign complicated expressions to symbolsand then evaluate them. \code{evalq} avoids this.\code{eval.parent(expr, n)} is a shorthand for \code{eval(expr,parent.frame(n))}.\code{local} evaluates an expression in a local environment. It isequivalent to \code{evalq} except the its default argument creates anew, empty environment. This is useful to create anonymous recursivefunctions and as a kind of limited namespace feature since variablesdefined in the environment are not visible from the outside.}\seealso{\code{\link{expression}}, \code{quote}, \code{\link{sys.frame}},\code{\link{parent.frame}}, \code{\link{environment}}.}\note{Due to the difference in scoping rules, there are some differencesbetween \R and S in this area. In particular, the default enclosurein S is the global environment.When evaluating expressions in dataframes that has been passed asargument to a function, the relevant enclosure is often the caller'senvironment, i.e., one needs\code{eval(x, data, parent.frame())}.}\examples{eval(2 ^ 2 ^ 3)mEx <- expression(2^2^3); mEx; 1 + eval(mEx)eval({ xx <- pi; xx^2}) ; xxa <- 3 ; aa <- 4 ; evalq(evalq(a+b+aa, list(a=1)), list(b=5)) # == 10a <- 3 ; aa <- 4 ; evalq(evalq(a+b+aa, -1), list(b=5)) # == 12ev <- function() {e1 <- parent.frame()## Evaluate a in e1aa <- eval(expression(a),e1)## evaluate the expression bound to a in e1a <- 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 kgg <- local({k <- local({a <- 1function(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))))}\keyword{data}\keyword{programming}