-
Notifications
You must be signed in to change notification settings - Fork 118
Open
Description
The exact question here is the following:
Boilerplate code from the chapter:
library(rlang)
expr_type <- function(x) {
if (rlang::is_syntactic_literal(x)) {
"constant"
} else if (is.symbol(x)) {
"symbol"
} else if (is.call(x)) {
"call"
} else if (is.pairlist(x)) {
"pairlist"
} else {
typeof(x)
}
}
switch_expr <- function(x, ...) {
switch(expr_type(x),
...,
stop("Don't know how to handle type ",
typeof(x), call. = FALSE))
}
find_T_call <- function(x) {
if (is_call(x, "T")) {
x <- as.list(x)[-1]
purrr::some(x, logical_abbr_rec)
} else {
purrr::some(x, logical_abbr_rec)
}
}
logical_abbr_rec <- function(x) {
switch_expr(
x,
# Base cases
constant = FALSE,
symbol = as_string(x) %in% c("F", "T"),
# Recursive cases
pairlist = purrr::some(x, logical_abbr_rec),
call = find_T_call(x)
)
}
logical_abbr <- function(x) {
logical_abbr_rec(enexpr(x))
}In the solution manual, you write that this is because the function can't handle closure:
But it actually can, and it works as expected with the provided code in question:
logical_abbr(function(x = TRUE) {
g(x + T)
})
#> [1] TRUEIt fails only when it can't find any negative case (i.e., any instance of T or F):
logical_abbr(function(x = TRUE) {
g(x + TRUE)
})
#> Error: Don't know how to handle type integerAm I missing something here?
Metadata
Metadata
Assignees
Labels
No labels

