Non-Standard Evaluation (NSE hereafter) occurs when R expressions are
captured and evaluated in a manner different than if they had been executed
without intervention. subset
is a canonical example, which we use here with
the built-in iris
data set:
subset(iris, Sepal.Width > 4.1)
Sepal.Width
does not exist in the global environment, yet this works because
subset
captures the expression and evaluates it within iris
.
A limitation of NSE is that it is difficult to use programmatically:
exp.a <- quote(Sepal.Width > 4.1) subset(iris, exp.a)
oshka::expand
facilitates programmable NSE, as with this simplified
version of subset
:
subset2 <- function(x, subset) { sub.exp <- expand(substitute(subset), x, parent.frame()) sub.val <- eval(sub.exp, x, parent.frame()) x[!is.na(sub.val) & sub.val, ] } subset2(iris, exp.a)
expand
is recursive:
exp.b <- quote(Species == 'virginica') exp.c <- quote(Sepal.Width > 3.6) exp.d <- quote(exp.b & exp.c) subset2(iris, exp.d)
We abide by R semantics so that programmable NSE functions are almost identical to normal NSE functions, with programmability as a bonus.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.