Olá a todos.
Gostaria de criar uma função que usa seus argumentos para filtrar colunas em um data.frame. O ponto é que eu gostaria que nos casos onde o usuário não declare o parâmetro, a função não faça esse filtro.
Existe alguma forma elegante de se fazer isso que não seja uma serie de if(is.null(arg)){}...
ou nem declarado como default do argumento todos os valores possíveis?
Exemplo simples:
library(magrittr)
filter_diamonds = function(what_cut = NULL,
what_color = NULL,
what_clarity= NULL){
data = ggplot2::diamonds
out = data %>%
dplyr::filter(cut %in% what_cut) %>%
dplyr::filter(color %in% what_color) %>%
dplyr::filter(clarity %in% what_clarity)
return(out)
}
filter_diamonds(what_cut = 'Premium', what_color = 'E' ,what_clarity = 'SI2') # Funciona bem
#> # A tibble: 519 × 10
#> carat cut color clarity depth table price x y z
#> <dbl> <ord> <ord> <ord> <dbl> <dbl> <int> <dbl> <dbl> <dbl>
#> 1 0.2 Premium E SI2 60.2 62 345 3.79 3.75 2.27
#> 2 0.82 Premium E SI2 60.8 60 2824 6.05 6.03 3.67
#> 3 0.75 Premium E SI2 61.9 57 2829 5.88 5.82 3.62
#> 4 0.8 Premium E SI2 60.2 57 2829 6.05 6.01 3.63
#> 5 0.83 Premium E SI2 59.2 60 2859 6.17 6.12 3.64
#> 6 0.82 Premium E SI2 61.7 59 2861 6.01 5.98 3.7
#> 7 0.79 Premium E SI2 61 58 2868 5.96 5.9 3.62
#> 8 0.81 Premium E SI2 62.5 59 2901 5.97 5.9 3.71
#> 9 0.31 Premium E SI2 60.9 60 558 4.38 4.35 2.66
#> 10 0.8 Premium E SI2 59.9 58 2939 6.03 5.96 3.59
#> # … with 509 more rows
filter_diamonds(what_cut = 'Premium') # Esperava ver todos os cut == Premium
#> # A tibble: 0 × 10
#> # … with 10 variables: carat <dbl>, cut <ord>, color <ord>, clarity <ord>,
#> # depth <dbl>, table <dbl>, price <int>, x <dbl>, y <dbl>, z <dbl>
Created on 2022-04-08 by the reprex package (v2.0.1)