Durante a última semana fiz o meu primeiro pacote do R. Chama-se ifelser, ele é um wrapper da função ifelse, vetorização dos famosos controles de fluxo if e else de todas as linguagens.

A vantagem de usar o ifelser está na construção de ifelse’s aninhados, varias condições dentro da mesma chamada da função.

Imagine o código a seguir:

var <- 1:3
ifelse(var == 1, log(var), ifelse(var == 2, var + 2*log(var), ifelse(var == 3, var + 5*log(var), 0)))
## [1] 0.000000 3.386294 8.493061

Como estamos chamando a função diversas vezes, acabamos nos perdendo no código. Se tivesse faltando um parênteses ou uma vírgula ficaria bem difícil de achar.

O mesmo código pode ser escrito usando o ifelser da seguinte maneira:

library(ifelser)
var <- 1:3
test_if(var == 1) %>% 
  if_true(log(var)) %>% if_false() %>%
  test_if(var == 2) %>%
  if_true(var + 2*log(var)) %>% if_false() %>%
  test_if(var == 3) %>% 
  if_true(var + 5*log(var)) %>% if_false(0)

Acredito que isso ajude bastante em muitas situações!

Instalando

O pacote não está disponível no CRAN, mas pode ser instalado usando o comando devtools::install_github("dfalbel/ifelser"). O código fonte também está disponível no github.

Desafio

Para criar o código do pacote precisei estudar bastante a Non Standard Evaluation do R, sem isso não seria possível construí-lo.

As funções do ifelser apenas guardam os argumentos passados para elas, quando a regra do ifelse está totalmente escrita, uma função constroi o código utilizando a função nativa do R (ifelse) e o avalia no ambiente (environment) correto.