аккуратный eval против base или get () против sym () против as.symbol () - PullRequest
3 голосов
/ 01 мая 2019

Я некоторое время пытался понять tidy eval или как использовать переменные внутри tidyverse, но мне, кажется, никогда не удается это полностью понять.

Например, я пытаюсь использовать ggplot с сопоставлениями переменных.Это будет базовая версия R:

library(ggplot2)
var1 = "wt"
var2 = "mpg"
ggplot(mtcars, aes(x = get(var1), y = get(var2))) + geom_point()

Однако, исходя из всей документации и обсуждений, которые я видел, «правильный» способ квази-цитаты будет выглядеть так:

ggplot(mtcars, aes(x = !!sym(var1), y = !!sym(var2))) + geom_point()

Может быть, этоболее сопоставим с:

ggplot(mtcars, aes(x = !!as.symbol(var1), y = !!as.symbol(var2))) + geom_point()

Метод get() короче и более читабелен для меня.Почему это избегает сообщества Tidyverse?

Ответы [ 2 ]

2 голосов
/ 01 мая 2019

Если фрейм данных содержит столбец var1 или var2, он будет выбран get() вместо объектов в вашей среде.

Также вы получите улучшенную автоматическую маркировкувыражения с квазиквотацией, когда вы изменяете захваченное выражение напрямую.

1 голос
/ 01 мая 2019

Я не очень знаком с Tidyeval, и я могу ошибаться по этому поводу. Насколько я понимаю, аккуратная оценка более полезна для немного более сложных упражнений, таких как объединение dplyr или tidyr с ggplot2 или обработка нескольких аргументов ( точка-точка-точка ). Вот функция, которая принимает сгруппированные переменные, переданные ..., вычисляет среднее значение для .summary_var и затем выводит результаты:

library(tidyverse)
gg_dummy_func <- function(.data, .summary_var, ...) {

  summary_var <- enquo(.summary_var)
  group_vars <- enquos(...)

  sum_data <- .data %>%
    group_by(!!!group_vars) %>%
    summarise(mean=mean(!!summary_var))

  gg <- ggplot(sum_data, aes(x=!!sym(names(sum_data)[1]), 
                             y=!!sym(names(sum_data)[2]),
                             color=mean)) +
    geom_point()
  print(gg)
}


gg_dummy_func(mtcars, mpg, wt, cyl)

enter image description here

...