Instrução IF, ELSE, ELSE IF em R

⚡ Resumo Inteligente

As instruções `if Else` e ​​`else If` em R escolhem qual bloco de código será executado com base em uma condição lógica. Este guia aborda a forma com duas ramificações, cadeias com múltiplas ramificações, a função `ifelse()` vetorizada e a função `switch()` para correspondências exatas.

  • 🔀 Sintaxe principal: if (condição) { } else { } executa um ramo quando o teste é VERDADEIRO e o outro quando é FALSO.
  • 🔗 Várias filiais: Em R, o operador `else if` é escrito como duas palavras separadas; não existe a palavra-chave `elif` como em... Python.
  • ⚠️ Cuidado com os limites: Use "maior ou igual a" e "menor ou igual a" para que nenhum valor caia em uma lacuna não intencional entre os ramos.
  • Forma vetorizada: ifelse(test, yes, no) avalia um vetor inteiro de uma só vez, o que if não pode fazer.
  • 🗂️ Correspondência exata: A função switch() substitui uma longa cadeia de testes de igualdade por uma única consulta.
  • 🧮 OperaEscolha do tor: O símbolo "&" simples funciona elemento a elemento, enquanto a forma dupla representa um único valor VERDADEIRO ou FALSO dentro de uma condição "if".

Declaração If Else Else If em R

A instrução if else em R

An se mais A instrução executa um bloco de código quando uma condição é VERDADEIRA e outro quando é FALSA. Em R, a sintaxe é:

if (condition) {
    Expr1 
} else {
    Expr2
}

Declaração If Else

Verifica se a variável chamada `quantity` é maior que 20. Se for, o código imprime "Você vendeu muito!", caso contrário, imprime "Não o suficiente para hoje".

# Create vector quantity
quantity <-  25
# Set the if-else statement
if (quantity > 20) {
    print('You sold a lot!')
} else {
    print('Not enough for today')  
}

Saída:

## [1] "You sold a lot!"

ObservaçãoA indentação não altera a forma como o R executa o código, mas uma indentação consistente é o que mantém uma longa cadeia de condições legível. Observe também que a chave de fechamento e a palavra-chave `else` devem estar na mesma linha; caso contrário, o R considera o bloco `if` como completo e gera um erro.

A instrução else if em R

Testes adicionais em cadeia com Senão seR não possui a palavra-chave elif, ou seja, PythonEm R, você escreve as duas palavras separadamente e pode adicionar quantas ramificações forem necessárias. A sintaxe é:

if (condition1) { 
    expr1
    } else if (condition2) {
    expr2
    } else if  (condition3) {
    expr3
    } else {
    expr4
}

Suponha que você queira três resultados: menos de 20 imprime "Não é suficiente para hoje", entre 20 e 30 imprime "Dia normal" e acima de 30 imprime "Que dia ótimo!".

Você pode tentar alterar a quantidade.

# Create the variable quantity
quantity <-  10
# Create multiple condition statement
if (quantity < 20) {
      print('Not enough for today')
} else if (quantity >= 20 & quantity <= 30) {
     print('Average day')
} else {
      print('What a great day!')
}

Saída:

## [1] "Not enough for today"

2 exemplo:

As taxas de IVA variam conforme a categoria do produto. Imagine três categorias, cada uma com sua própria taxa:

Categorias Produtos NIF
A Livro, revista, jornal, etc. 8%
B Vegetais, carnes, bebidas, etc. 10%
C Camiseta, jeans, calça, etc. 20%

Uma cadeia "else if" aplica a taxa correta ao produto comprado pelo cliente:

category <- 'A'
price <- 10
if (category =='A'){
  cat('A vat rate of 8% is applied.','The total price is',price *1.08)  
} else if (category =='B'){
    cat('A vat rate of 10% is applied.','The total price is',price *1.10)  
} else {
    cat('A vat rate of 20% is applied.','The total price is',price *1.20)  
}

Saída:

## A vat rate of 8% is applied. The total price is 10.8

A função vetorizada ifelse() em R

A instrução `if` lida com exatamente um valor. Se você fornecer um vetor, o R 4.2 ou posterior gerará um erro, pois a condição deve ser um único valor `TRUE` ou `FALSE`. A função `ifelse()` resolve isso testando cada elemento de uma vez e retornando um vetor de mesmo comprimento.

quantities <- c(10, 25, 40, 18)

# if cannot do this
result <- ifelse(quantities > 20, 'You sold a lot!', 'Not enough for today')
result

Saída:

## [1] "Not enough for today" "You sold a lot!"      "You sold a lot!"      
## [4] "Not enough for today"

Os três argumentos são o teste, o valor retornado quando o teste é VERDADEIRO e o valor retornado quando é FALSO. Todos os três são reciclados até atingirem o mesmo comprimento.

Aninhar `ifelse()` reproduz uma cadeia `else if` em todo o vetor:

ifelse(quantities < 20, 'Not enough for today',
    ifelse(quantities <= 30, 'Average day', 'What a great day!'))

É importante conhecer duas limitações. A função `ifelse()` remove atributos como níveis de fator e classe de data do resultado e avalia ambos os ramos para cada elemento, o que é um desperdício quando um dos ramos é custoso. A alternativa é o dplyr. caso_quando() Evita completamente o aninhamento e mantém os tipos intactos:

library(dplyr)
case_when(
    quantities < 20  ~ 'Not enough for today',
    quantities <= 30 ~ 'Average day',
    TRUE             ~ 'What a great day!'
)

A instrução switch() em R

Quando cada ramo testa a mesma variável para igualdade, uma longa cadeia else if torna-se difícil de ler. switch() substitui isso por uma única verificação.

category <- 'A'
price <- 10

vat <- switch(category,
    'A' = 1.08,
    'B' = 1.10,
    'C' = 1.20,
    1.20)          # the unnamed last value is the default

cat('The total price is', price * vat)

Três regras regem seu comportamento:

  • Com um argumento de caractere, a função switch() encontra a correspondência exata do nome. Não há correspondência parcial nem correspondência de padrões.
  • Um elemento final sem nome atua como o valor padrão. Sem ele, um valor não correspondido retorna NULL de forma invisível, o que é uma fonte comum de erros silenciosos.
  • Com um argumento inteiro, switch() seleciona por posição: switch(2, “a”, “b”, “c”) retorna “b”.

Use `switch()` para correspondências exatas com um conjunto fixo de valores e reserve `else if` para intervalos e condições compostas, que `switch()` não consegue expressar. Para aplicar uma condição repetidamente a uma sequência, combine-a com um `if`. para laço loop while.

lógico Operatores em condições R

Os operadores que criam uma condição se comportam de maneira diferente uns dos outros, e essa diferença importa.

Operator Significado Use em
& Em termos de elementos E ifelse(), filter(), vetores inteiros
&& AND de valor único, curto-circuitos se () e enquanto ()
| OU elemento a elemento ifelse(), filter(), vetores inteiros
|| Circuito OU de valor único, curto-circuito se () e enquanto ()
! NÃO, invalida o teste. A qualquer hora
%em% O valor está neste conjunto? Substitui longas correntes OR

Por que o curto-circuito é importante. A forma dupla para assim que a resposta é definida, portanto o lado direito nunca é avaliado quando o lado esquerdo já decidiu o resultado. Isso torna seguro escrever uma cláusula de guarda:

# Safe: length() is checked before x[1] is touched
if (length(x) > 0 && x[1] > 10) print('ok')

Comparando com diversos valores. Opte por usar %in% em vez de encadear testes de igualdade, que é mais curto e mais difícil de digitar incorretamente:

if (category %in% c('A', 'B')) {
    print('Reduced VAT rate applies')
}

Um último aviso: um único sinal de igual atribui um valor, não compara. Sempre use == dentro de uma condição.

Instruções condicionais em R: Guia rápido

Todas as construções utilizadas neste tutorial estão listadas abaixo:

Objetivo Code
Dois ramos
if (cond) { a } else { b }
Várias ramificações
if (c1) { a } else if (c2) { b } else { c }
Condição vetorizada
ifelse(test, yes, no)
Múltiplas ramificações em um vetor
case_when(c1 ~ a, c2 ~ b, TRUE ~ c)
Pesquisa de correspondência exata
switch(x, "A" = 1, "B" = 2, 0)
Teste de adesão
if (x %in% c("A", "B")) { }

Perguntas Frequentes

A função `if` lida com um único valor `TRUE` ou `FALSE` e controla qual bloco de código será executado. `ifelse()` é uma função vetorizada que testa cada elemento de um vetor e retorna um vetor de resultados.

Use a forma dupla dentro de `if` e `while`, onde a condição deve ser um único valor e o curto-circuito protege o lado direito. Use a forma simples para testes elemento a elemento em vetores inteiros.

Desde o R 4.2, uma condição `if` deve conter exatamente um valor `TRUE` ou `FALSE`; vetores mais longos agora geram um erro em vez de um aviso. Use `ifelse()`, `any()` ou `all()` dependendo do que você pretendia.

As condições ditam as regras de engenharia de recursos e a parada antecipada.ping verificações durante o treinamento e decisões de limite na saída do modelo. Formas vetorizadas, como case_when(), são preferíveis porque escalam para conjuntos de dados inteiros.

Sim. Os assistentes de IA conseguem identificar falhas, como um valor limite que atravessa todos os ramos ou um único sinal de igual usado para comparação. Teste você mesmo a cadeia corrigida nos valores limite.

Resuma esta postagem com: