Стандартная оценка внутри функции с помощью dplyr

У меня есть данные с большим количеством факторных переменных, которые я визуализирую, чтобы получить представление о каждой из переменных. Я воспроизводю большую часть кода с небольшими изменениями для имен переменных и т. д., поэтому решил написать функцию для простых вещей. Я просто не могу заставить его работать...

Фиктивные данные

ID <- sample(1:32, 128, replace = TRUE)
AgeGrp <- sample(c("18-65", "65-75", "75-85", "85+"), 128, replace = TRUE)
ID <- factor(ID)
AgeGrp <- factor(AgeGrp)
data <- data_frame(ID, AgeGrp)
data

В основном то, что я пытаюсь сделать с каждой факторной переменной, — это создать гистограмму с метками процентов внутри столбцов. Например, с фиктивными данными.

plotstats <-   #Create a table with pre-summarised percentages                    
  data %>%                    
  group_by(AgeGrp) %>%                
  summarise(count = n()) %>% 
  mutate(pct = count/sum(count)*100)  

age_plot <-     #Plot the data            
    ggplot(data,aes(x = AgeGrp)) +
    geom_bar() +                    #Add the percentage labels using pre-summarised table
    geom_text(data = plotstats, aes(label=paste0(round(pct,1),"%"),y=pct),
                                    size=3.5, vjust = -1, colour = "sky blue") +
    ggtitle("Count of Age Group")
age_plot

dummy_plot

Это отлично работает с фиктивными данными, но когда я пытаюсь создать функцию...

 basic_plot <- 
        function(df, x){

        plotstats <-
        df %>%
        group_by_(x) %>%               
        summarise_(
                   count = ~n(),
                   pct = ~count/sum(count)*100)

       plot <-                   
         ggplot(df,aes(x = x)) +
         geom_bar() + 
         geom_text(data = plotstats, aes(label=paste0(round(pct,1),"%"),
                                    y=pct), size=3.5, vjust = -1, colour = "sky blue")

    plot

  }

basic_plot(data, AgeGrp)

Я получаю код ошибки:

Ошибка в UseMethod("as.lazy"): нет применимого метода для "as.lazy", примененного к объекту класса "factor"

Я рассмотрел вопросы здесь, здесь и здесь, а также просмотрел Виньетка NSE, но не могу найти свою ошибку.


person davidhen    schedule 17.02.2017    source источник
comment
AgeGrp оценивается, прежде чем вы передадите его basic_plot. 1) изменить строку с ggplot(df, aes(x = x)) на ggplot(df, aes_(x = x)) и вызвать функцию как: basic_plot(data, quote(AgeGrp)). Следует также отметить, что это вполне достижимо без стандартной оценки, но это может быть хорошим обучающим примером.   -  person Chrisss    schedule 17.02.2017
comment
Это здорово - спасибо. Это полностью работает сейчас. Мне было бы интересно, как это сделать с NSE. Единственная причина, по которой я остановился на SE, заключалась в том, что я не мог заставить функцию работать, когда впервые написал ее с помощью обычного кода dplyr NSE.   -  person davidhen    schedule 18.02.2017