Sw

Switch em R

1 exercício

Sobre Switch

A função switch() pode ser um substituto conciso para uma longa série de testes if ... else if. A variável sobre a qual se faz o switch geralmente é uma string e, nesse caso, as aspas podem ser omitidas do seletor.

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"

Repare que as opções só passam para a seguinte se o valor for deixado em branco, como acontece com o M no exemplo acima. Não é preciso incluir instruções break, como em algumas outras linguagens.

O último valor pode ser um padrão, como aqui, ou um stop() para lançar um erro, caso as condições devam ser exaustivas. Fazer switch com um número inteiro é um pouco diferente: nesse caso, o padrão é sempre NULL (o que será discutido no conceito Nada).

Funções no dplyr

O switch do R base é bastante limitado: ele só faz uma correspondência exata com uma única entrada. Isso parecia razoável quando o R foi lançado, em 1993, mas precisa melhorar para os usos modernos.

Note

Como mencionado no conceito Conditionals, a coleção de pacotes tidyverse foi criada para complementar (e às vezes substituir) as funcionalidades do R base sem afetar a compatibilidade com versões anteriores.

Os pacotes do tidyverse também têm uma documentação excelente e moderna, então seguir os links abaixo dará mais detalhes.

Você pode trazer o pacote dplyr para o escopo adicionando library(dplyr) (para o pacote individual) ou library(tidyverse) (para a coleção inteira) no topo do seu código.

A biblioteca dplyr oferece duas funções extras relacionadas ao switch.

As funções recode_values e replace_values

Essas duas funções relacionadas permitem um mapeamento vetorizado, parecido com o switch, de valores antigos para valores novos.

A principal diferença entre elas é que recode_values() cria um vetor totalmente novo, enquanto replace_values() permite atualizações parciais de um vetor existente.

A correspondência continua exata, mas:

  • As opções à esquerda podem ser vetores, e a correspondência acontece se qualquer elemento corresponder.
  • As opções à esquerda e os resultados à direita são ligados por um til ~ em vez de =.
  • Valores ausentes NA podem ser correspondidos explicitamente (isso será discutido no conceito Nada).
  • Um padrão pode ser especificado em todos os 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

Você pode encontrar conselhos online sobre usar a função case_match() como um switch vetorizado.

Essa função foi descontinuada no dplyr versão 1.2.0 (fevereiro de 2026). Tentativas de usá-la agora produzem uma mensagem de aviso, sugerindo o uso de recode_values().

A função case_when

A case_when leva a sintaxe de case_match um passo adiante, permitindo qualquer expressão lógica à esquerda do ~.

O vetor de entrada (x no exemplo abaixo) não é passado como argumento; ele só precisa já estar 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?"

A função between() também faz parte do dplyr.

As funções de string já foram discutidas e as Expressões Regulares serão o assunto de um conceito posterior. Elas se combinam muito bem com 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 via GitHub O link abre em uma nova janela ou aba

Aprenda Switch