【发布时间】:2021-02-22 11:58:11
【问题描述】:
我无法理解以下代码返回错误的原因:
d <- tibble(a = 1:10, x = 1:10, y = 1:10)
f <- function(.data, expr) {
plot_ly(.data %>% filter({{ expr }}), x = ~x, y = ~y) %>% add_markers()
}
f(d, a <= 5)
# "Error in as.list.environment(x, all.names = TRUE) : object 'a' not found"
但这按预期运行:
g <- function(.data, expr) {
plot_ly(.data %>% filter({{ expr }})) %>% add_markers(x = ~x, y = ~y)
}
g(d, a <= 5)
似乎在同一个函数调用中使用 tidy eval 和 plot_ly 波浪号公式会导致 tidy eval 出现问题?我想了解为什么以防止将来出现错误。有没有办法在同一个函数调用中仍然使用它们?我找到了this 替代方案:
h <- function(.data, expr) {
rlang::eval_tidy(
rlang::quo_squash(quo({
plot_ly(.data %>% filter({{ expr }}), x = ~x, y = ~y) %>% add_markers()
}))
)
}
h(d, a <= 5)
但我宁愿使用上面的第二种形式 g()
【问题讨论】: