Como criar uma função com “diferente de”?

Sep 12 2020

Tenho uma função que estou tentando criar usando filter !=, mas não funciona. Eu me pergunto se isso se deve a algo relacionado a uma avaliação arrumada.

Isso é o que eu tentei:

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

data <- read_spss("http://staff.bath.ac.uk/pssiw/stats2/SAQ.sav")
data$Q01_L <- as_label(data$Q01)

Esta é a função que tentei escrever:

    bar_plot <- function(data, var) {
      var <- rlang::ensym(var)
      
      data %>% 
        filter(!var == "Neither") %>% 
        ggplot(aes(!!var)) +
        geom_bar() +
        coord_flip() +
        theme_classic() +
        labs(x = "Question", y = "Count", title = var_label(data$var)) 
    }
    
    
    bar_plot(data, Q01_L)

O que estou tentando alcançar é remover os valores "Nenhum" e tentei usar isso, filter(!var == "Neither")mas não funcionou e ainda estou recebendo "Nenhum" plotado. E também perdi o título do gráfico.

Isso é o que estou tentando alcançar:

Consegui fazer isso com algumas linhas de código:

data %>% 
  filter(!Q01_L == "Neither") %>% 
  ggplot(aes(Q01_L)) +
  geom_bar() +
  coord_flip() +
  theme_classic() +
  labs(x = "Question", y = "Count", title = var_label(data$Q01_L)) 

Mas não consigo descobrir como convertê-lo em uma função.

Respostas

3 DarrenTsai Sep 11 2020 at 22:47

Você pode usar o operador encaracolado em uma função, para que ele var <- rlang::ensym(var)possa ser removido.

De help("nse-force"):

O operador encaracolado {{ }} para argumentos de função é um pouco especial porque força o argumento de função e o neutraliza imediatamente. A expressão defundida é substituída no lugar, pronta para ser avaliada em outro contexto, como o quadro de dados.

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

bar_plot(data, Q01_L)
3 Duck Sep 11 2020 at 22:29

Você também pode usar !!(créditos @DarrenTsai) e !=:

#Plot
bar_plot <- function(.data, var) {
  var <- rlang::ensym(var)
  
  data %>% 
    filter(!!var != "Neither") %>% 
    ggplot(aes(!!var)) +
    geom_bar() +
    coord_flip() +
    theme_classic() +
    labs(x = "Question", y = "Count", title = var_label(data[,var])) 
}


bar_plot(data, Q01_L)

Resultado:

3 Liman Sep 11 2020 at 22:24

Tente evalcomofilter(!eval(var) == "Neither")

 bar_plot <- function(.data, var) {
    var <- rlang::ensym(var)
    
    data %>% 
        filter(!eval(var) == "Neither") %>% 
        ggplot(aes(!!var)) +
        geom_bar() +
        coord_flip() +
        theme_classic() +
        labs(x = "Question", y = "Count", title = var_label(data[var])) 
}


bar_plot(data, Q01_L)