#r #plotly #tidyeval
#r #plotly #tidyeval
Вопрос:
Мне трудно понять, почему следующий код возвращает ошибку:
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)
Кажется, что использование аккуратного eval и формулы plot_ly tilde в одном и том же вызове функции каким-то образом вызывает проблему для аккуратного eval? Я хотел бы понять, почему, чтобы предотвратить будущие ошибки. Есть ли способ по-прежнему использовать их в том же вызове функции? Я нашел эту альтернативу:
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 () выше
Ответ №1:
Вторая форма, на которую вы ссылаетесь, не имеет особого смысла, я бы избегал ее.
Если я перепишу вашу функцию таким образом, она, похоже, сработает:
f <- function(.data, expr) {
.data %>%
filter({{ expr }}) %>%
plot_ly(
x = ~x,
y = ~y
) %>%
add_markers()
}
Хотя не уверен, почему.
Когда я печатаю обратную ссылку на ошибку в вашем сообщении, я вижу, что plotly все еще использует lazyeval под капотом, предшественник tidy eval . Это немного подозрительно, возможно, стоит сообщить об ошибке в репозитории plotly.
Комментарии:
1. Спасибо, я отправлю отчет об ошибке.