Como criar uma função com “diferente de”?
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
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)
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:
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)