R — ошибка объединения аккуратного eval и тильды в plot_ly

#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. Спасибо, я отправлю отчет об ошибке.