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.
