IF, ELSE, ELSE IF avaldus R-is

โšก Nutikas kokkuvรตte

R-i laused If Else ja Else If valivad loogilise tingimuse pรตhjal, millist koodiplokki kรคivitada. See kรคsiraamat hรตlmab kaheharulist vormi, mitmeharulisi ahelaid, vektoriseeritud ifelse() funktsiooni ja tรคpsete vastete leidmiseks funktsiooni switch().

  • ๐Ÿ”€ Pรตhisรผntaks: if (condition) { } else { } kรคivitab รผhe haru, kui test on TRUE, ja teise, kui see on FALSE.
  • ๐Ÿ”— Mitmed harud: R kirjutab โ€želse ifโ€ kahe eraldi sรตnana; puudub mรคrksรตna โ€želifโ€, nagu nรคiteks Python.
  • โš ๏ธ Piiride hooldus: Kasutage suurema-vรตi-vรตrdse- ja vรคiksema-vรตi-vรตrdse-tingimusi, et รผkski vรครคrtus ei satuks harude vahele tahtmatusse tรผhimikku.
  • โšก Vektoriseeritud vorm: ifelse(test, yes, no) hindab terve vektori korraga, mida if ei suuda.
  • ๐Ÿ—‚๏ธ Tรคpne sobivus: switch() asendab pika vรตrdustestide ahela รผhe otsinguga.
  • ๐Ÿงฎ OperaTori valik: รœksik ampersand tรถรถtab elemendipรตhiselt, topeltvorm aga รผhe TRUE vรตi FALSE vรครคrtuse jaoks if-i sees.

If Else Else If lause R-is

if else lause R-is

An kui veel Lause kรคivitab รผhe koodiploki, kui tingimus on Tร•ENE, ja teise, kui see on Vร„ร„R. R-is on sรผntaks jรคrgmine:

if (condition) {
    Expr1 
} else {
    Expr2
}

Kui muidu avaldus

Kontrolli, kas muutuja nimega quantity on suurem kui 20. Kui on, siis kuvab kood teate โ€žMรผรผsid palju!โ€œ, vastasel juhul โ€žTรคnaseks pรคevaks mitte piisavaltโ€œ.

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

Vรคljund:

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

mรคrkusedTaandamine ei muuda seda, kuidas R koodi kรคivitab, kuid jรคrjepidev taanemine on see, mis hoiab pika tingimuste ahela loetavana. Pane tรคhele, et sulgev sulg ja mรคrksรตna โ€želseโ€ peavad asuma samal real, vastasel juhul kรคsitleb R if-plokki tรคielikuna ja annab vea.

Else if lause R-is

Keti edasised testid koos muidu kuiR-il puudub mรคrksรตna elif, st PythonR-is kirjutad need kaks sรตna eraldi ja vรตid lisada nii palju harusid kui vaja. Sรผntaks on:

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

Oletame, et soovite kolme tulemust: alla 20 pildi โ€žTรคnaseks pรคevaks ei piisaโ€œ, 20โ€“30 pildi โ€žKeskmine pรคevโ€œ ja รผle 30 pildi โ€žMilline suurepรคrane pรคev!โ€œ.

Vรตite proovida kogust muuta.

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

Vรคljund:

## [1] "Not enough for today"

Nรคide 2:

Kรคibemaksumรครคrad erinevad tootekategooriate lรตikes. Kujutage ette kolme kategooriat, millel kรตigil on oma mรครคr:

Kategooriad Tooted VAT
A Raamat, ajakiri, ajaleht jne. 8%
B Kรถรถgiviljad, liha, joogid jne. 10%
C T-sรคrk, teksa, pรผksid jne. 20%

Elukorral rakendab ahel รตiget mรครคra kรตigele, mida klient ostis:

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

Vรคljund:

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

Vektoriseeritud funktsioon ifelse() R-is

if-lause kรคsitleb tรคpselt รผhte vรครคrtust. Andke sellele vektor ja R 4.2 vรตi uuem versioon tekitab vea, kuna tingimus peab olema รผks TRUE vรตi FALSE. ifelse() lahendab selle, testides iga elementi korraga ja tagastades sama pikkusega vektori.

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

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

Vรคljund:

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

Kolm argumenti on test, tagastatud vรครคrtus, kui test on Tร•ENE, ja tagastatud vรครคrtus, kui see on Vร„ร„R. Kรตik kolm taaskasutatakse sama pikkusega.

Funktsiooni ifelse() pesastamine reprodutseerib else if ahela terve vektori ulatuses:

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

Tasub teada kahte piirangut. ifelse() jรคtab tulemusest vรคlja sellised atribuudid nagu faktori tasemed ja kuupรคevaklass ning hindab iga elemendi puhul mรตlemat haru, seega on see raiskamine, kui รผks haru on kallis. Alternatiiv on dplyr. juhtum_millal() vรคldib pesastamist tรคielikult ja hoiab tรผรผbid puutumata:

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

R-i lรผliti() lause

Kui iga haru kontrollib sama muutuja vรตrdsust, muutub pikk else if ahel raskesti loetavaks. switch() asendab selle รผhe otsinguga.

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)

Selle kรคitumist reguleerivad kolm reeglit:

  • Mรคrkide argumendi korral leiab switch() nime tรคpselt. Osalist vastet ega mustri vastet ei leita.
  • Vaikimisi toimib nimetu viimane element. Ilma selleta tagastab vasteta vรครคrtus nรคhtamatult NULL-i, mis on vaiksete vigade levinud allikas.
  • Tรคisarvulise argumendi korral valib switch() hoopis positsiooni jรคrgi: switch(2, โ€œaโ€, โ€œbโ€, โ€œcโ€) tagastab โ€œbโ€.

Tรคpsete vastete leidmiseks fikseeritud vรครคrtuste komplekti korral kasutage funktsiooni switch() ja hoidke else if alles vahemike ja liittingimuste puhul, mida switch() ei suuda vรคljendada. Tingimuse korduvaks rakendamiseks jรคrjestusele kombineerige see funktsiooniga silmuse jaoks vรตi samas silmus.

loogiline OperaR-tingimustes olevad tegurid

Tingimuse loovad operaatorid kรคituvad รผksteisest erinevalt ja see erinevus on oluline.

Operator Tรคhendus Kasutage seda sisse
& Elementide kaupa JA ifelse(), filter(), tรคisvektorid
&& รœhe vรครคrtusega JA, lรผhised kui () ja samal ajal kui ()
| Elementide kaupa Vร•I ifelse(), filter(), tรคisvektorid
|| รœhe vรครคrtusega Vร•I, lรผhised kui () ja samal ajal kui ()
! NOT, tรผhistab testi kuskil
%% ulatuses Kas selle komplekti vรครคrtus on? Asendab pikki OR-ahelaid

Miks lรผhis on oluline. Topeltvorm peatub kohe, kui vastus on paigas, seega paremat poolt ei hinnata kunagi, kui vasak pool on juba tulemuse otsustanud. See teeb kaitsva lause kirjutamise ohutuks:

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

Vรตrdlemine mitme vรครคrtusega. Vรตrdsustestide aheldamise asemel kasutage funktsiooni %in%, mis on nii lรผhem kui ka raskem valesti sisestada:

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

Veel รผks viimane hoiatus: รผks vรตrdusmรคrk mรครคrab vรครคrtuse, mitte ei vรตrdle. Kirjuta tingimuse sisse alati ==.

Tingimuslaused R-is: kiirjuhend

Kรตik selles รตpetuses kasutatud konstruktsioonid on loetletud allpool:

Eesmรคrk Code
Kaks haru
if (cond) { a } else { b }
Mitmed harud
if (c1) { a } else if (c2) { b } else { c }
Vektoriseeritud seisund
ifelse(test, yes, no)
Mitmeharuline vektor
case_when(c1 ~ a, c2 ~ b, TRUE ~ c)
Tรคpse vaste otsing
switch(x, "A" = 1, "B" = 2, 0)
Liikmelisuse test
if (x %in% c("A", "B")) { }

KKK

if kรคsitleb รผhte TRUE vรตi FALSE vรครคrtust ja kontrollib, milline koodiplokk kรคivitatakse. ifelse() on vektoriseeritud funktsioon, mis testib vektori iga elementi ja tagastab tulemuste vektori.

Kasutage if ja while operaatorite sees topeltvormi, kus tingimus peab olema รผks vรครคrtus ja lรผhis kaitseb paremat poolt. Kasutage รผksikvormi tรคisvektorite elementide kaupa testimiseks.

Alates versioonist R 4.2 peab if-tingimus olema tรคpselt รผks TRUE vรตi FALSE, pikemad vektorid tekitavad nรผรผd hoiatuse asemel vea. Kasuta ifelse(), any() vรตi all() funktsioone olenevalt sellest, mida sa silmas pidasid.

Tingimused juhivad omaduste insenerireegleid, varajast peatamistping kontrollid treeningu ajal ja lรคvivรครคrtusotsused mudeli vรคljundi kohta. Eelistatakse vektoriseeritud vorme, nรคiteks case_when(), kuna need skaleeruvad tervetele andmekogumitele.

Jah. Tehisintellekti assistendid suudavad mรคrgata lรผnki, nรคiteks iga haru lรคbivaid piirivรครคrtusi vรตi vรตrdluseks kasutatavat รผhte vรตrdusmรคrki. Testi parandatud ahelat ise piirivรครคrtuste peal.

Vรตta see postitus kokku jรคrgmiselt: