La función switch() puede ser un reemplazo conciso para una larga serie de pruebas if ... else if.
La variable sobre la que se hace el switch suele ser un string y, en ese caso, se pueden omitir las comillas del selector.
star <- function(type) {
switch(type,
M = , # will "fall through" if no value given
K = "red dwarf",
G = "Earth-like",
"bigger star" # only correct for O,B,A,F
)
}
> star("M")
[1] "red dwarf"
Ten en cuenta que las opciones solo pasan al siguiente caso si el valor se deja en blanco, como con M en el ejemplo anterior.
No es necesario incluir sentencias break como en otros lenguajes.
El último valor puede ser un valor predeterminado, como aquí, o un stop() para lanzar un error si se pretende que las condiciones sean exhaustivas.
Hacer switch sobre un entero es un poco distinto: en ese caso, el valor predeterminado siempre es NULL (lo veremos en el concepto de la Nada).
dplyr
El switch de R base es bastante limitado: solo hace una coincidencia exacta con un único valor.
Esto parecía razonable cuando R se lanzó por primera vez en 1993, pero necesita mejoras para el uso moderno.
Como se mencionó en el concepto Conditionals, la colección de paquetes tidyverse está diseñada para complementar (y a veces reemplazar) la funcionalidad de R base sin afectar la compatibilidad con versiones anteriores.
Los paquetes de tidyverse también tienen una documentación excelente y moderna, así que si sigues los enlaces de abajo obtendrás más detalles.
Puedes traer el paquete dplyr al ámbito agregando library(dplyr) (para el paquete individual) o library(tidyverse) (para toda la colección) al inicio de tu código.
La biblioteca dplyr ofrece dos funciones adicionales relacionadas con switch.
recode_values y replace_values
Estas dos funciones relacionadas permiten un mapeo vectorizado, similar a un switch, de valores antiguos a valores nuevos.
La principal diferencia entre ellas es que recode_values() crea un vector completamente nuevo, mientras que replace_values() permite actualizar parcialmente un vector existente.
La coincidencia sigue siendo exacta, pero:
~ en lugar de =.NA se pueden hacer coincidir de forma explícita (lo veremos en el concepto de la Nada).library(dplyr)
x <- c("a", "b", "a", "d", "b", NA, "c", "e", "z")
recode_values(
x,
"a" ~ 1,
"b" ~ 2,
"c" ~ 3,
c("d", "e") ~ 4, # either "d' or "e" will match
NA ~ 0, # matches missing values
default = 100 # note the different syntax for the default
)
#> [1] 1 2 1 4 2 0 3 4 100
Es posible que veas en internet consejos sobre usar la función case_match() como un switch vectorizado.
Esta función quedó obsoleta en la versión 1.2.0 de dplyr (febrero de 2026).
Si intentas usarla, ahora se mostrará un mensaje de advertencia que recomienda usar recode_values() en su lugar.
case_when
case_when lleva la sintaxis de case_match un paso más allá, ya que permite cualquier expresión lógica a la izquierda de la ~.
El vector (x en el ejemplo de abajo) no se pasa como argumento; simplemente debe estar ya definido.
x <- 1:10
case_when(
x < 3 ~ "low",
between(x, 3, 5) ~ "mid",
between(x, 6, 8) ~ "high",
.default = "what?"
)
#> [1] "low" "low" "mid" "mid" "mid" "high" "high" "high" "what?" "what?"
La función between() también forma parte de dplyr.
Las funciones de string ya se vieron y las expresiones regulares serán el tema de un concepto posterior.
Estas se combinan muy bien con case_when.
library(stringr)
tracks <- "R C Python C# Elixir C++ Odin" |> str_split_1(" ")
tracks
#> [1] "R" "C" "Python" "C#" "Elixir" "C++" "Odin"
case_when(
str_starts(tracks, "C") ~ "C-like",
str_starts(tracks, "[AEIOU]") ~ "vowel",
.default = "other"
)
#> [1] "other" "C-like" "other" "C-like" "vowel" "C-like" "vowel"