IF, ELSE, ELSE IF erklæring i R

⚡ Smart opsummering

If Else- og Else If-sætninger i R vælger, hvilken kodeblok der kører baseret på en logisk betingelse. Denne gennemgang dækker to-grenet form, flergrenede kæder, den vektoriserede ifelse()-funktion og switch() for nøjagtige matches.

  • 🔀 Kernesyntaks: hvis (betingelse) { } ellers kører { } én gren, når testen er SAND, og ​​den anden, når den er FALSK.
  • 🔗 Flere grene: R skriver else if som to separate ord; der er intet elif-nøgleord som i Python.
  • ⚠️ Grænsepleje: Brug 'større eller lig med' og 'mindre eller lig med', så ingen værdi falder gennem et utilsigtet mellemrum mellem grene.
  • Vektoriseret form: hvis(test, yes, no) evaluerer en hel vektor på én gang, hvilket hvis ikke kan.
  • 🗂️ Præcis match: switch() erstatter en lang kæde af lighedstests med et enkelt opslag.
  • 🧮 OperaTors valg: Et enkelt og-tegn fungerer elementmæssigt, mens dobbeltformen er for et enkelt SANDT eller FALSK inde i "if".

If Else Else If-sætning i R

if else-sætningen i R

An hvis ellers En sætning kører én kodeblok, når en betingelse er SAND, og ​​en anden, når den er FALSK. I R er syntaksen:

if (condition) {
    Expr1 
} else {
    Expr2
}

Hvis andet erklæring

Tjek om en variabel med navnet mængde er over 20. Hvis den er det, skriver koden "Du solgte meget!", ellers skriver den "Ikke nok til i dag".

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

Output:

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

BemærkIndrykning ændrer ikke, hvordan R kører koden, men ensartet indrykning er det, der holder en lang kæde af betingelser læsbar. Bemærk også, at den afsluttende parentes og nøgleordet else skal være på samme linje, ellers behandler R if-blokken som komplet og giver en fejl.

Else if-sætningen i R

Kæd yderligere tests med ellers hvisR har intet elif-nøgleord, dvs. Python; i R skriver du de to ord separat, og du kan tilføje så mange grene, som du har brug for. Syntaksen er:

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

Antag, at du ønsker tre resultater: under 20 udskrifter "Ikke nok til i dag", mellem 20 og 30 udskrifter "Gennemsnitlig dag", og over 30 udskrifter "Sikke en fantastisk dag!".

Du kan prøve at ændre mængden.

# 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!')
}

Output:

## [1] "Not enough for today"

Eksempel 2:

Momssatserne varierer afhængigt af produktkategorien. Forestil dig tre kategorier, hver med sin egen sats:

Kategorier Produkter Moms
A Bog, magasin, avis osv. 8%
B Grøntsager, kød, drikkevarer osv. 10%
C T-shirt, jeans, bukser osv.. 20%

En ellers hvis-kæde anvender den korrekte pris på det, kunden har købt:

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)  
}

Output:

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

Den vektoriserede funktion ifelse() i R

if-sætningen håndterer præcis én værdi. Giv den en vektor, og R 4.2 eller nyere genererer en fejl, fordi betingelsen skal være en enkelt SAND eller FALSK. ifelse() løser dette ved at teste hvert element på én gang og returnere en vektor af samme længde.

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

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

Output:

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

De tre argumenter er testen, den værdi, der returneres, hvor testen er SAND, og ​​den værdi, der returneres, hvor den er FALSK. Alle tre genbruges til samme længde.

Indlejring af ifelse() reproducerer en else if-kæde på tværs af en hel vektor:

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

To begrænsninger er værd at kende. ifelse() fjerner attributter som faktorniveauer og datoklasse fra resultatet, og den evaluerer begge grene for hvert element, så det er spild af værdi, når én gren er dyr. dplyr-alternativet case_when() undgår indlejring helt og holder typerne intakte:

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

Switch()-sætningen i R

Når hver branch tester den samme variabel for lighed, bliver en long else if chain svær at læse. switch() erstatter den med et enkelt opslag.

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)

Tre regler styrer dens adfærd:

  • Med et tegnargument matcher switch() navnet præcist. Der er ingen delvis matchning og ingen mønstermatchning.
  • Et unavngivet final-element fungerer som standard. Uden et sådant element returnerer en uovertruffen værdi NULL usynligt, hvilket er en almindelig kilde til tavse fejl.
  • Med et heltalsargument vælger switch() i stedet efter position: switch(2, “a”, “b”, “c”) returnerer “b”.

Brug switch() til præcise matches mod et fast sæt værdier, og hold else if for intervaller og sammensatte betingelser, som switch() ikke kan udtrykke. For at anvende en betingelse gentagne gange over en sekvens, kombiner den med en til løkke eller mens løkke.

Logisk Operatorer i R-betingelser

De operatorer, der opbygger en betingelse, opfører sig forskelligt fra hinanden, og forskellen er vigtig.

OperaTor Betydning Brug den i
& Elementmæssigt OG ifelse(), filter(), hele vektorer
&& Enkeltværdi OG, kortslutninger hvis () og mens ()
| Elementvis ELLER ifelse(), filter(), hele vektorer
|| Enkeltværdi ELLER, kortslutninger hvis () og mens ()
! IKKE, ophæver testen Overalt
%i% Er værdien i dette sæt? Erstatter lange OR-kæder

Hvorfor kortslutning er vigtig. Dobbeltformen stopper, så snart svaret er afgjort, så højre side evalueres aldrig, når venstre side allerede har bestemt resultatet. Det gør det sikkert at skrive en guard-klausul:

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

Sammenligning med flere værdier. Brug %in% i stedet for at kæde lighedstests sammen, hvilket både er kortere og sværere at skrive forkert:

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

En sidste advarsel: et enkelt lighedstegn tildeler en værdi, det sammenligner ikke. Skriv altid == i en betingelse.

Betingelsessætninger i R: Hurtig reference

Hver konstruktion, der bruges i denne vejledning, er anført nedenfor:

Objektiv Code
To grene
if (cond) { a } else { b }
Flere grene
if (c1) { a } else if (c2) { b } else { c }
Vektoriseret tilstand
ifelse(test, yes, no)
Flergrenet på en vektor
case_when(c1 ~ a, c2 ~ b, TRUE ~ c)
Opslag af præcist match
switch(x, "A" = 1, "B" = 2, 0)
Medlemskabstest
if (x %in% c("A", "B")) { }

Ofte Stillede Spørgsmål

if håndterer en enkelt SAND eller FALSK og styrer hvilken kodeblok der kører. ifelse() er en vektoriseret funktion, der tester hvert element i en vektor og returnerer en vektor med resultater.

Brug dobbeltformen i if og while, hvor betingelsen skal være én værdi, og kortslutning beskytter højre side. Brug enkeltformen til elementvise tests på hele vektorer.

Siden R 4.2 skal en if-betingelse være præcis én SAND eller FALSK; længere vektorer giver nu en fejl i stedet for en advarsel. Brug ifelse(), any() eller all() afhængigt af hvad du mente.

Betingelser styrer funktionstekniske regler, tidlig stopping kontroller under træning og tærskelbeslutninger på modeloutput. Vektoriserede former som case_when() foretrækkes, fordi de skalerer til hele datasæt.

Ja. AI-assistenter kan finde huller, såsom en grænseværdi, der går gennem hver gren, eller et enkelt lighedstegn, der bruges til sammenligning. Test selv den korrigerede kæde på grænseværdierne.

Opsummer dette indlæg med: