Мені подобається, purrr::when
і інші базові рішення, які тут пропонуються, чудові, але я хотів чогось більш компактного та гнучкого, тому я розробив функцію pif
(pipe if), див. Код та документ в кінці відповіді.
Аргументи можуть бути як вираженнями функцій (підтримується позначення формули), а вхідні дані за замовчуванням повертаються незмінними, якщо умова є FALSE
.
Використано на прикладах з інших відповідей:
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)
Інші приклади:
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"))
Функція
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
}
}