¿Cómo agregar una función dentro de una función?

Sep 11 2020

Tengo una función para crear una trama. Sin embargo, me gustaría incluir algún preprocesamiento dentro de la función para convertir valores en etiquetas usando el sjlabelledpaquete.

library(haven)
data <- read_spss("http://staff.bath.ac.uk/pssiw/stats2/SAQ.sav")

library(dplyr)
library(labelled)
library(sjlabelled)

bar_plot <- function(data, var) {
  
  data %>% 
    as_label(var) %>% 
    filter({{var}} != "Neither") %>% 
    ggplot(aes({{var}})) +
    geom_bar() +
    coord_flip() +
    theme_classic() +
    labs(x = NULL, y = "Count", title = var_label(pull(data, {{var}})))
}

bar_plot(data, Q01)

Recibo un gráfico pero es incorrecto y aparece este error en la consola 1 variables were not found in the dataset: var

He intentado utilizar curly-curly, eval, !!, sym, ensym, pero ninguno de ellos funcionó.

El problema está en esta línea: as_label(var) %>%

Respuestas

2 astrofunkswag Sep 11 2020 at 20:26

El problema es que la as_labelfunción captura la entrada del usuario con deparse y substitute . Puede echar un vistazo a la función usted mismo:, sjlabelled:::as_label.data.frameo llamarla con debug.

Para solucionar esto, puede usar una combinación de do.cally ensym( enexprtambién funciona).

bar_plot <- function(data, var) {

  data <- do.call(as_label, list(data, ensym(var)))
  
  data %>% 
    filter({{ var }} != "Neither") %>% 
    ggplot(aes({{ var }})) +
    geom_bar() +
    coord_flip() +
    theme_classic() +
    labs(x = NULL, y = "Count", title = var_label(pull(data, {{ var }})))
}


data %>% bar_plot(Q01)