R While Loop cu exemple de programare

⚡ Rezumat inteligent

În timp ce bucla (Loop) din programarea R repetă un bloc de cod atâta timp cât condiția sa rămâne ADEVĂRATĂ (TRUE). Condiția este testată înainte de fiecare trecere, deci este posibil ca corpul să nu ruleze niciodată, iar ceva din interiorul său trebuie să facă în cele din urmă condiția FALSE (FALSE).

  • 🔁 Sintaxă de bază: while (condition) { expression } testează mai întâi condiția și execută corpul expresiei doar cât timp aceasta este evaluată ca TRUE.
  • ⚠️ Regula de reziliere: O instrucțiune în interiorul corpului trebuie să modifice condiția, altfel bucla nu se termină niciodată.
  • 🔢 Model de contracarare: Inițializați o variabilă înainte de buclă și incrementați-o în interior, ceea ce este idiomul standard de numărare.
  • 🛑 Controlul debitului: break iese imediat din buclă și next sare la următoarea iterație.
  • 🔁 repetați Alternativă: Repeat rulează necondiționat și se bazează în întregime pe break, ceea ce se potrivește logicii stilului do-while.
  • 📐 Când să alegi: Se utilizează `while` când numărul de iterații este necunoscut în avans și `pentru` când acesta este fix.

While Loop în R

While Loop în programarea R

A în timp ce bucla în R repetă un bloc de cod atâta timp cât condiția sa rămâne ADEVĂRATĂ. Condiția este testată înainte la fiecare trecere, deci o buclă while poate rula de zero ori dacă condiția este FALSĂ de la început.

Sintaxa While Loop în R

Mai jos este sintaxa pentru While Loop în programarea R:

while (condition) {
     Exp	
}

R While Loop diagramă de flux

R While Loop diagramă de flux
R While Loop diagramă de flux

notițeCeva din interiorul buclei trebuie să transforme în cele din urmă condiția în FALSE. Dacă nu se întâmplă nimic, bucla rulează la nesfârșit și trebuie să întrerupeți R cu Esc sau Ctrl+C.

Bucla while vs. bucla for vs. bucla repeat în R

R oferă trei toaleteping construcții, iar alegerea între ele se reduce la știrea dinainte a numărului de iterații necesare.

Criterii în timp ce pentru repeta
Număr de iterații Necunoscut în avans Cunoscut în prealabil Necunoscut în avans
Condiție testată Înainte de fiecare trecere Secvența este epuizată Niciodată, trebuie să suni la pauză
Rulare minimă Zero Zero O
Utilizare tipică Convergență către un prag Parcurgerea unui vector sau a unei liste Logica stilului Do-while
Sintaxă în timp ce (continuare) { } pentru (i în v) { } repetare { … pauză }
# repeat always runs at least once
count <- 1
repeat {
    print(count)
    count <- count + 1
    if (count > 5) break
}

Exemplul de acțiune de mai sus este o potrivire naturală pentru while: nu poți ști dinainte câte extrageri aleatorii vor fi necesare înainte ca prețul să scadă la 45.

Bucla While în R: Exemple

Exemplu 1

Începeți cu cel mai simplu posibil R programare exemplu. Creați un contor și adăugați 1 la acesta la fiecare trecere. Bucla trebuie să se poată termina, așa că condiția îi spune explicit lui R să se oprească odată ce variabila trece valoarea de 10.

notițe: Dacă doriți să vedeți valoarea curentă a buclei, trebuie să includeți variabila în funcția print().

#Create a variable with value 1
begin <- 1

#Create the loop
while (begin <= 10){

#See which loop we are on
cat('This is loop number', begin, '\n')

#add 1 to the variable begin after each loop
begin <- begin+1
print(begin)
}

ieșire:

## This is loop number 1[1] 2
## This is loop number 2[1] 3
## This is loop number 3[1] 4
## This is loop number 4[1] 5
## This is loop number 5[1] 6
## This is loop number 6[1] 7
## This is loop number 7[1] 8
## This is loop number 8[1] 9
## This is loop number 9[1] 10
## This is loop number 10[1] 11

Exemplu 2

Să presupunem că ați cumpărat o acțiune la 50 de dolari. Dacă prețul scade la 45 sau mai puțin, doriți să o vindeți, altfel continuați să mențineți poziția. Fiecare trecere a buclei mișcă prețul aleatoriu cu până la 10 în orice direcție în jurul valorii de 50:

set.seed(123)
# Set variable stock and price
stock <- 50
price <- 50

# Loop variable counts the number of loops 
loop <- 1

# Set the while statement
while (price > 45){

# Create a random price between 40 and 60
price <- stock + sample(-10:10, 1)

# Count the number of loop
loop <- loop + 1

# Print the number of loop
print(loop)
}

ieșire:

## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
cat('it took',loop,'loop before we short the price. The lowest price is',price)

ieșire:

## it took 7 loop before we short the price. The lowest price is 40

Cum se utilizează break și next într-o buclă While

Două cuvinte cheie modifică fluxul normal al oricărei bucle R.

  • rupe iese imediat din buclă, sări pesteping fiecare iterație rămasă.
  • următor abandonează doar iterația curentă și trece direct la următorul test de condiție.
# break: stop as soon as a condition is met
i <- 1
while (i <= 100) {
    if (i * i > 50) {
        cat('First square above 50 is', i * i, '\n')
        break
    }
    i <- i + 1
}

# next: skip the even numbers
i <- 0
while (i < 10) {
    i <- i + 1
    if (i %% 2 == 0) next
    print(i)
}

O capcană care merită știută. Într-o buclă while, next revine la testul de condiție fără rulând orice sub acesta. Dacă contorul este incrementat în partea de jos a corpului, next sare peste acel increment și bucla se blochează pentru totdeauna. De aceea, al doilea exemplu incrementează înainte următoarea afirmație, mai degrabă decât după ea.

Erori frecvente în bucla While și bucle infinite

Patru greșeli explică aproape fiecare buclă while eșuată.

  • Contorul nu este niciodată actualizat. Uitarea incrementării lasă condiția permanent la TRUE. Apăsați Esc în RStudio sau Ctrl+C într-un terminal pentru a întrerupe.
  • Condiția returnează NA. Dacă vreo valoare din test este NA, R se oprește cu „valoarea lipsă unde este nevoie de TRUE/FALSE”. Protejați-o cu is.na() sau cu isTRUE().
  • Condiția este mai lungă decât un element. Începând cu R 4.2, o condiție cu lungime mai mare decât unu este o eroare și nu un avertisment. O încadrezi în any() sau all().
  • Comparația în virgulă mobilă nu devine niciodată FALSE. în timp ce (x != 0.3) se poate repeta la nesfârșit deoarece 0.1 + 0.2 nu este exact 0.3. Comparați în schimb cu o toleranță, folosind abs(x – 0.3) > 1e-8.
# Safety valve: cap the number of iterations
iter <- 0
while (price > 45 && iter < 1000) {
    price <- stock + sample(-10:10, 1)
    iter <- iter + 1
}

Adăugarea unui număr maxim de iterații este o asigurare ieftină în orice buclă a cărei ieșire depinde de date aleatorii sau externe.

Întrebări frecvente

O buclă while își testează condiția înainte de prima trecere, deci poate rula de zero ori. O buclă repetitivă nu are nicio condiție și rulează întotdeauna cel puțin o dată, ieșind doar când ajunge la o instrucțiune break.

Apăsați Esc în RStudio sau Ctrl+C într-un terminal pentru a întrerupe execuția. Preveniți situația asigurându-vă că o instrucțiune din interiorul corpului modificării condiției și adăugând un contor de iterații maxime.

Se utilizează „while” atunci când numărul de iterații depinde de un rezultat calculat în interiorul buclei, cum ar fi așteptarea ca o valoare să depășească un prag. Se utilizează atunci când secvența este cunoscută înainte de începerea buclei.

Algoritmii iterativi, cum ar fi descreșterea gradientului, k-means și maximizarea așteptărilor, rulează până la convergență, mai degrabă decât pentru un număr fix, ceea ce este exact modelul while.

Da. Asistenții inteligenți artificiali pot detecta o actualizare lipsă a contorului sau o condiție care nu poate deveni niciodată FALSE. Adăugați întotdeauna o instrucțiune de tipărire sau un plafon de iterație pentru a confirma diagnosticul pe baza propriilor date.

Rezumați această postare cu: