1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
|
eval_bang <- function(expr, data_mask, context_mask) {
x <- walk_data_tree(expr[[2]], data_mask, context_mask)
vars <- data_mask$.__tidyselect__.$internal$vars
sel_complement(x, vars)
}
eval_or <- function(expr, data_mask, context_mask) {
x <- walk_operand(expr[[2]], data_mask, context_mask)
y <- walk_operand(expr[[3]], data_mask, context_mask)
sel_union(x, y)
}
eval_and <- function(expr, data_mask, context_mask) {
x <- expr[[2]]
y <- expr[[3]]
if (is_symbol(x) && is_symbol(y)) {
x_name <- as_string(x)
y_name <- as_string(y)
x <- eval_sym(x, data_mask, context_mask, strict = TRUE)
y <- eval_sym(y, data_mask, context_mask, strict = TRUE)
if (!is_function(x) && !is_function(y)) {
abort(glue_c(
"Can't take the intersection of two columns.",
i = "`{x_name} & {y_name}` is always an empty selection."
))
}
}
x <- walk_operand(x, data_mask, context_mask)
y <- walk_operand(y, data_mask, context_mask)
sel_intersect(x, y)
}
walk_operand <- function(expr, data_mask, context_mask) {
if (is_symbol(expr)) {
expr <- eval_sym(expr, data_mask, context_mask, strict = TRUE)
}
walk_data_tree(expr, data_mask, context_mask)
}
stop_bad_bool_op <- function(bad, ok) {
abort(glue_c(
"Can't use scalar `{bad}` in selections.",
i = "Do you need `{ok}` instead?"
))
}
stop_bad_arith_op <- function(op) {
abort(glue_c(
"Can't use arithmetic operator `{op}` in selection context."
))
}
stop_formula <- function(expr) {
f <- as_label(expr)
abort(glue_line(c(
"Formula shorthand must be wrapped in `where()`.",
"",
" # Bad",
" data %>% select({f})",
"",
" # Good",
" data %>% select(where({f}))"
)))
}
|