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

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

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.
