Eu gosto purrr::when
e as outras soluções básicas fornecidas aqui são ótimas, mas eu queria algo mais compacto e flexível, então projetei a função pif
(pipe if), veja o código e o doc no final da resposta.
Os argumentos podem ser expressões de funções (a notação de fórmula é suportada) e a entrada é retornada inalterada por padrão se a condição for FALSE
.
Usado em exemplos de outras respostas:
data.frame(a=1:2) %>%
mutate(b=a^2) %>%
pif(~b[1]>1, ~mutate(.,b=b^2)) %>%
mutate(b=b^2)
1:3 %>% pif(sum(.) < 25,sum,0)
1 %>% pif(TRUE,~. + 1) %>% `*`(2)
1 %>% `+`(1) %>% pif(TRUE ,~ .+1)
Outros exemplos:
iris %>% pif(is.data.frame, dim, nrow)
iris %>% pif(~is.numeric(Species),
~"numeric :)",
~paste(class(Species)[1],":("))
iris %>% pif(nrow(.) > 2, head(.,2))
iris %>% pif(TRUE, dim, warning("this will be evaluated"))
iris %>% pif(TRUE, dim, ~warning("this won't be evaluated"))
Função
if(!requireNamespace("purrr"))
stop("Package 'purrr' needs to be installed to use function 'pif'")
if(inherits(p, "formula"))
p <- purrr::as_mapper(
if(!is.list(x)) p else update(p,~with(...,.)))
if(inherits(true, "formula"))
true <- purrr::as_mapper(
if(!is.list(x)) true else update(true,~with(...,.)))
if(inherits(false, "formula"))
false <- purrr::as_mapper(
if(!is.list(x)) false else update(false,~with(...,.)))
if ( (is.function(p) && p(x)) || (!is.function(p) && p)){
if(is.function(true)) true(x) else true
} else {
if(is.function(false)) false(x) else false
}
}