dplyr
имеет векторизованные условия if_else
и case_when
.
Однако оба они охотно оценивают свои возможные выходы (true/false
для if_else
, RHS формулы для case_when
):
suppressPackageStartupMessages({
library(dplyr)
})
if_else(c(T, T, T), print(1), print(2))
#> [1] 1
#> [1] 2
#> [1] 1 1 1
case_when(
c(T, T, T) ~ print(1),
c(F, F, F) ~ print(2)
)
#> [1] 1
#> [1] 2
#> [1] 1 1 1
Создано в 2020-02-05 пакетом Представить (v0.3.0)
Здесь мы можем очевидно, что false
случаи оцениваются, даже если они никогда не используются. Я ищу способ избежать этого, так как мой
Есть ли альтернатива, которая этого не делает?
Я знаю, одна альтернатива на самом деле base::ifelse
:
ifelse(c(T, T, T), print(1), print(2))
#> [1] 1
#> [1] 1 1 1
Однако base::ifelse
общеизвестно неэффективен, так что лучшая альтернатива будет хорошей. При этом меня особенно интересуют альтернативы для case_when
, которые я использую довольно часто, когда в противном случае мне нужно было бы использовать цепочку из ifelse
s.
Я уже смотрел на data.table::fifelse
, но она страдает от той же проблемы:
suppressPackageStartupMessages({
library(data.table)
})
fifelse(c(T, T, T), print(1), print(2))
#> [1] 1
#> [1] 2
#> [1] 1 1 1
Итак, есть ли альтернатива для if_else
и case_when
, которая не с готовностью оценивает свои неиспользованные случаи?