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: