This function allows you to vectorize multiple if_else() statements.
If no cases match, NA is returned.
This function derived from dplyr::case_when()
.
Unlike dplyr::case_when()
, in_case()
supports piping elegantly and
attempts to handle inconsistent types (see examples).
in_case(..., preserve = FALSE, default = NA)
<dynamic-dots
> A sequence of two-sided
formulas.
The left hand side (LHS) determines which values match this case.
The right hand side (RHS) provides the replacement value.
The LHS must evaluate to a logical vector.
Both LHS and RHS may have the same length of either 1 or n
.
The value of n
must be consistent across all cases.
The case of n == 0
is treated as a variant of n != 1
.
NULL
inputs are ignored.
If TRUE
, unmatched elements of the input will be
returned unmodified.
(The elements may have their type coerced to be compatible with
replacement values.)
If FALSE
, unmatched elements of the input will be replaced
with default
.
Defaults to FALSE
.
If preserve
is FALSE
, a value to replace unmatched
elements of the input.
Defaults to NA
.
A vector of length 1 or n, matching the length of the logical input or output vectors. Inconsistent lengths will generate an error.
in_case_fct()
to return a factor and
in_case_list()
to return a list
switch_case()
a simpler alternative for when each case involves
==
or %in%
fn_case()
, a simpler alternative for when each case uses the
same function
if_case()
, a pipeable alternative to dplyr::if_else()
dplyr::case_when()
, from which this function is derived
# Non-piped statements are handled the same as dplyr::case_when()
x <- 1:30
in_case(
x %% 15 == 0 ~ "fizz buzz",
x %% 3 == 0 ~ "fizz",
x %% 5 == 0 ~ "buzz",
TRUE ~ x
)
#> [1] "1" "2" "fizz" "4" "buzz" "fizz"
#> [7] "7" "8" "fizz" "buzz" "11" "fizz"
#> [13] "13" "14" "fizz buzz" "16" "17" "fizz"
#> [19] "19" "buzz" "fizz" "22" "23" "fizz"
#> [25] "buzz" "26" "fizz" "28" "29" "fizz buzz"
# A vector can be directly piped into in_case() without error
1:30 %>%
in_case(
. %% 15 == 0 ~ "fizz buzz",
. %% 3 == 0 ~ "fizz",
. %% 5 == 0 ~ "buzz",
TRUE ~ .
)
#> [1] "1" "2" "fizz" "4" "buzz" "fizz"
#> [7] "7" "8" "fizz" "buzz" "11" "fizz"
#> [13] "13" "14" "fizz buzz" "16" "17" "fizz"
#> [19] "19" "buzz" "fizz" "22" "23" "fizz"
#> [25] "buzz" "26" "fizz" "28" "29" "fizz buzz"
# in_case() silently converts types
1:30 %>%
in_case(
. %% 15 == 0 ~ 35,
. %% 3 == 0 ~ 5,
. %% 5 == 0 ~ 7,
TRUE ~ NA
)
#> [1] NA NA 5 NA 7 5 NA NA 5 7 NA 5 NA NA 35 NA NA 5 NA 7 5 NA NA 5 7
#> [26] NA 5 NA NA 35
x <- 1:30
try(
dplyr::case_when(
x %% 15 == 0 ~ 35,
x %% 3 == 0 ~ 5,
x %% 5 == 0 ~ 7,
TRUE ~ NA
)
)
#> [1] NA NA 5 NA 7 5 NA NA 5 7 NA 5 NA NA 35 NA NA 5 NA 7 5 NA NA 5 7
#> [26] NA 5 NA NA 35
# default and preserve make it easier to handle unmatched values
1:30 %>%
in_case(
. %% 15 == 0 ~ "fizz buzz",
. %% 3 == 0 ~ "fizz",
. %% 5 == 0 ~ "buzz",
default = "pass"
)
#> [1] "pass" "pass" "fizz" "pass" "buzz" "fizz"
#> [7] "pass" "pass" "fizz" "buzz" "pass" "fizz"
#> [13] "pass" "pass" "fizz buzz" "pass" "pass" "fizz"
#> [19] "pass" "buzz" "fizz" "pass" "pass" "fizz"
#> [25] "buzz" "pass" "fizz" "pass" "pass" "fizz buzz"
1:30 %>%
in_case(
. %% 15 == 0 ~ "fizz buzz",
. %% 3 == 0 ~ "fizz",
. %% 5 == 0 ~ "buzz",
preserve = TRUE
)
#> [1] "1" "2" "fizz" "4" "buzz" "fizz"
#> [7] "7" "8" "fizz" "buzz" "11" "fizz"
#> [13] "13" "14" "fizz buzz" "16" "17" "fizz"
#> [19] "19" "buzz" "fizz" "22" "23" "fizz"
#> [25] "buzz" "26" "fizz" "28" "29" "fizz buzz"