switch_type() is equivalent to switch(type_of(x, ...)), while switch_class() switchpatches based on class(x). The coerce_ versions are intended for type conversion and provide a standard error message when conversion fails.

switch_type(.x, ...)

coerce_type(.x, .to, ...)

switch_class(.x, ...)

coerce_class(.x, .to, ...)



An object from which to dispatch.


Named clauses. The names should be types as returned by type_of().


This is useful when you switchpatch within a coercing function. If supplied, this should be a string indicating the target type. A catch-all clause is then added to signal an error stating the conversion failure. This type is prettified unless .to inherits from the S3 class "AsIs" (see base::I()).

See also



switch_type(3L, double = "foo", integer = "bar", "default" )
#> [1] "bar"
# Use the coerce_ version to get standardised error handling when no # type matches: to_chr <- function(x) { coerce_type(x, "a chr", integer = as.character(x), double = as.character(x) ) } to_chr(3L)
#> [1] "3"
# Strings have their own type: switch_type("str", character = "foo", string = "bar", "default" )
#> [1] "bar"
# Use a fallthrough clause if you need to dispatch on all character # vectors, including strings: switch_type("str", string = , character = "foo", "default" )
#> [1] "foo"
# special and builtin functions are treated as primitive, since # there is usually no reason to treat them differently: switch_type(base::list, primitive = "foo", "default" )
#> [1] "foo"
switch_type(base::`$`, primitive = "foo", "default" )
#> [1] "foo"
# closures are not primitives: switch_type(rlang::switch_type, primitive = "foo", "default" )
#> [1] "default"