108 lines
2.5 KiB
R
108 lines
2.5 KiB
R
|
## ---- echo = FALSE-------------------------------------------------------
|
||
|
knitr::opts_chunk$set(collapse = TRUE, comment = "#>")
|
||
|
rownames(mtcars) <- NULL
|
||
|
|
||
|
## ------------------------------------------------------------------------
|
||
|
library(lazyeval)
|
||
|
f <- function(x = a - b) {
|
||
|
lazy(x)
|
||
|
}
|
||
|
f()
|
||
|
f(a + b)
|
||
|
|
||
|
## ------------------------------------------------------------------------
|
||
|
a <- 10
|
||
|
b <- 1
|
||
|
lazy_eval(f())
|
||
|
lazy_eval(f(a + b))
|
||
|
|
||
|
## ------------------------------------------------------------------------
|
||
|
lazy_eval(f(), list(a = 1))
|
||
|
|
||
|
## ------------------------------------------------------------------------
|
||
|
lazy_eval(~ a + b)
|
||
|
h <- function(i) {
|
||
|
~ 10 + i
|
||
|
}
|
||
|
lazy_eval(h(1))
|
||
|
|
||
|
## ------------------------------------------------------------------------
|
||
|
subset2_ <- function(df, condition) {
|
||
|
r <- lazy_eval(condition, df)
|
||
|
r <- r & !is.na(r)
|
||
|
df[r, , drop = FALSE]
|
||
|
}
|
||
|
|
||
|
subset2_(mtcars, lazy(mpg > 31))
|
||
|
|
||
|
## ------------------------------------------------------------------------
|
||
|
subset2_(mtcars, ~mpg > 31)
|
||
|
subset2_(mtcars, quote(mpg > 31))
|
||
|
subset2_(mtcars, "mpg > 31")
|
||
|
|
||
|
## ------------------------------------------------------------------------
|
||
|
subset2 <- function(df, condition) {
|
||
|
subset2_(df, lazy(condition))
|
||
|
}
|
||
|
subset2(mtcars, mpg > 31)
|
||
|
|
||
|
## ------------------------------------------------------------------------
|
||
|
above_threshold <- function(df, var, threshold) {
|
||
|
cond <- interp(~ var > x, var = lazy(var), x = threshold)
|
||
|
subset2_(df, cond)
|
||
|
}
|
||
|
above_threshold(mtcars, mpg, 31)
|
||
|
|
||
|
## ------------------------------------------------------------------------
|
||
|
x <- 31
|
||
|
f1 <- function(...) {
|
||
|
x <- 30
|
||
|
subset(mtcars, ...)
|
||
|
}
|
||
|
# Uses 30 instead of 31
|
||
|
f1(mpg > x)
|
||
|
|
||
|
f2 <- function(...) {
|
||
|
x <- 30
|
||
|
subset2(mtcars, ...)
|
||
|
}
|
||
|
# Correctly uses 31
|
||
|
f2(mpg > x)
|
||
|
|
||
|
## ---- eval = FALSE-------------------------------------------------------
|
||
|
# x <- 31
|
||
|
# g1 <- function(comp) {
|
||
|
# x <- 30
|
||
|
# subset(mtcars, comp)
|
||
|
# }
|
||
|
# g1(mpg > x)
|
||
|
# #> Error: object 'mpg' not found
|
||
|
|
||
|
## ------------------------------------------------------------------------
|
||
|
g2 <- function(comp) {
|
||
|
x <- 30
|
||
|
subset2(mtcars, comp)
|
||
|
}
|
||
|
g2(mpg > x)
|
||
|
|
||
|
## ------------------------------------------------------------------------
|
||
|
library(lazyeval)
|
||
|
f1 <- function(x) lazy(x)
|
||
|
g1 <- function(y) f1(y)
|
||
|
|
||
|
g1(a + b)
|
||
|
|
||
|
## ------------------------------------------------------------------------
|
||
|
f2 <- function(x) lazy(x, .follow_symbols = FALSE)
|
||
|
g2 <- function(y) f2(y)
|
||
|
|
||
|
g2(a + b)
|
||
|
|
||
|
## ------------------------------------------------------------------------
|
||
|
a <- 10
|
||
|
b <- 1
|
||
|
|
||
|
lazy_eval(g1(a + b))
|
||
|
lazy_eval(g2(a + b))
|
||
|
|