"Evaluating" "Expressions" in "Environments"?
evaluatingExpressions.Rd"Evaluating" "Expressions" in "Environments"?
Expressions
The term "expression" is just a fancy way of describing any bit of (valid) code than can be parsed and evaluated (executed) by R. For example, the following bits of code are all valid R "expressions":
2 + 2sqrt(2)x <- (1:10)^2log(x, base = 10) |> mean(na.rm = TRUE)sum((x - mean(x))^2)
Expressions are frequently built of other expressions: so 2 + 2 is an expression, and sqrt(2 + 2) is an expression.
The { } operators are used to group any valid expressions into one bigger expression.
You can also use ; to write two expressions on the same line, like x <- 2; log(x^2)
Evaluation
An expression like sum((x - mean(x))^2) is just a sequence of characters until we do something with it.
We call this "evaluating" the expression.
This exactly what the R "interpreter" does when you "run" some R code.
In R, an evaluated expression always "returns" a "result"—a value, like a number, character string, or some other data.
Some expressions might "return" NULL as their result, but it's still a result!
In a multi-line expression, like
or
the result of the overall expression is simply the result of the last expression—so the last two examples both return the result 4.
Environment
To evaluate an expression, R must look up any variable names in the expression in the current "environment";
For example, the expression sum((x - mean(x))^2) includes the variables sum, mean, and x.
The variables sum and mean are base R functions, so R will find them no problem (unless you remove them).
However, x is not generally going to be "defined" unless you've defined it.
If you try to evaluate sum((x - mean(x))^2), you'll get an error if x is not defined.
There are many different "environments" in R, where R will search for variables: When you run R, you can save variables in the global environment; R-packages have their own environments; every time you call a function, the function has its own environment inside it—this is why a function can "see" it's own arguments, but variable you save inside a function isn't "visible" outside the function.
One of the greatest features of R is that we can often tell R to evaluate an expression using a specific data.frame as the environment, so we can use the column names of our data as variables. The humdrumR with(in) (and their tidyverse equivalents) use this functionality a lot!
Incomplete expressions
One of the most annoying things that can happen in R is if you try running something and it kind just hangs,
getting stuck with nothing happening no matter how many times you press enter.
This is usually because you have (accidentally) provided R an incomplete expression.
For example, 2 + is an incomplete expression—that + needs a number after it!
Failing to have properly paired parentheses will often result in incomplete expressions:
For example, mean(sqrt(log(x)) is an incomplete expression!
See also
Other R lessons.:
groupingFactors,
partialMatching,
recycling,
vectorization