Tracks
/
R
R
/
Temario
/
Switch
Sw

Switch en R

1 ejercicio

Acerca de Switch

La función switch() puede ser un sustituto conciso para una larga serie de comprobaciones 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 a la siguiente si el valor se deja en blanco, como ocurre con M en el ejemplo anterior. No es necesario incluir instrucciones break como en otros lenguajes.

El valor final puede ser un valor por defecto, como aquí, o un stop() para lanzar un error si se pretende que las condiciones sean exhaustivas. Hacer el switch sobre un número entero es un poco distinto: en estos casos el valor por defecto siempre es NULL (lo cual se tratará en el concepto Nothingness).

Funciones en dplyr

El switch de R base es bastante limitado: solo hace una coincidencia exacta con una única entrada. Esto parecía razonable cuando se lanzó R por primera vez en 1993, pero necesita mejorar para el uso moderno.

Note

Como se mencionó en el concepto Conditionals, la colección de paquetes tidyverse está diseñada para complementar (y a veces sustituir) la funcionalidad de R base sin afectar a la retrocompatibilidad.

Los paquetes de tidyverse también tienen una documentación excelente y moderna, así que si sigues los enlaces de abajo encontrarás más detalles.

Puedes traer el paquete dplyr al scope añadiendo library(dplyr) (para el paquete individual) o library(tidyverse) (para toda la colección) al principio de tu código.

La biblioteca dplyr proporciona dos funciones adicionales relacionadas con switch.

Las funciones 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 actualizaciones parciales de un vector existente.

La coincidencia sigue siendo exacta, pero:

  • Las opciones de la izquierda pueden ser vectores, y la entrada coincide si coincide algún elemento.
  • Las opciones de la izquierda y los resultados de la derecha se enlazan con una tilde ~ en lugar de =.
  • Los valores ausentes NA se pueden hacer coincidir explícitamente (esto se tratará en el concepto Nothingness).
  • Se puede especificar un valor por defecto en todos los casos.
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
Note

Es posible que veas consejos en internet 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). Los intentos de usarla ahora producen un mensaje de advertencia que recomienda usar recode_values() en su lugar.

La función 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 de entrada (x en el ejemplo de abajo) no se pasa como argumento, solo tiene que 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 trataron, y las expresiones regulares serán el tema de un concepto posterior. 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"
Editar en GitHub El enlace se abre en una nueva ventana o pestaña

Aprende Switch