Na koniec przyjrzymy się pętlom while, które wykorzystują inny sposób zapętlania niż pętle for. W przypadku pętli for znamy liczbę elementów w obiekcie, których używamy do iteracji, więc z góry znamy liczbę iteracji, które zostaną wykonane. Jednak są chwile, w których nie znamy tej liczby przed rozpoczęciem iteracji, a zamiast tego będziemy iterować w oparciu o spełnienie pewnego warunku po każdej iteracji. Wtedy przydatne są pętle while Sposób działania pętli while polega na tym, że określamy warunek, tak jak w przypadku warunków if …else i jeśli warunek jest spełniony, przechodzimy do iteracji. Po zakończeniu iteracji ponownie sprawdzamy warunek i jeśli nadal jest prawdziwy, powtarzamy iterację i tak dalej. Zauważ, że w tym przypadku, jeśli chcemy zatrzymać się w pewnym momencie, musimy zmodyfikować elementy użyte w warunku tak, aby w pewnym momencie wyniósł FALSE. Możesz także użyć break i next wewnątrz pętli while. Poniższy przykład pokazuje, jak wydrukować wszystkie liczby całkowite od 1 do 10. Zauważ, że jeśli zaczynamy od 1 tak jak robimy, ale zamiast dodawać 1 po każdej iteracji, odejmujemy 1 lub nie zmieniamy didn’t nigdy nie przestanie iterować. Dlatego musisz być bardzo ostrożny podczas używania pętli while, ponieważ liczba iteracji może być nieskończona:
x <- 1
while (x <= 10) {
prit(x)
x<- x + 1
}
#> [1] 1
#> [1] 2
#> [1] 3
#> [1] 4
#> [1] 5
#> [1] 6
#> [1] 7
#> [1] 8
#> [1] 9
#> [1] 10
Jeśli chcesz wykonać nieskończoną pętlę, możesz użyć pętli while z wartością TRUE zamiast warunku. Jeśli nie dołączysz polecenia break, kod skutecznie zapewni nieskończoną pętlę i będzie się powtarzał, dopóki nie zostanie zatrzymany za pomocą polecenia klawiaturowego CTRL + C lub innego mechanizmu zatrzymywania w używanym IDE. Jednak w takich przypadkach czystsze jest użycie konstrukcji powtarzania, jak pokazano poniżej. Może się to wydawać sprzeczne z intuicją, ale są chwile, kiedy użycie nieskończonych pętli jest przydatne. W takich przypadkach masz zewnętrzny mechanizm używany do zatrzymania programu na podstawie warunku zewnętrznego względem R. następujący przykład spowoduje awarię sesji R:
# DO NOT ExECUTE THIS IT’s AN INFIITE LOOP
x <- 1
repeat {
print(x)
x <- x +1
}
#> [1] 1
#> [1] 2
#> [1] 3
#> [1] 4
#> [1] 5
#> [1] 5
…