Perulangan while
while loop di R terus menjalankan badannya selama sebuah kondisi tetap TRUE. Kalau for loop berjalan sekali untuk setiap elemen dari sesuatu, while berjalan sebanyak jumlah yang tidak diketahui, sampai sebuah kondisi berubah:
Tiga bagian membuat setiap while loop bekerja, dan ketiganya terlihat di sini:
- Persiapan sebelum perulangan:
count <- 1memberi kondisinya sesuatu untuk diuji. - Kondisinya:
count <= 5, dibangun dari operator perbandingan yang biasa, diperiksa sebelum setiap putaran. - Pembaruan di dalam badan:
count <- count + 1menggerakkan perulangan menuju berhenti.
Hapus bagian 3, dan kondisinya TRUE selamanya: perulangannya tidak pernah berakhir. Itulah risiko utama while, dan sisa halaman ini sebagian besar membahas cara mengelolanya.
Kondisi Diperiksa Sebelum Setiap Putaran
while menguji kondisinya lebih dulu, lalu menjalankan badannya. Ada dua akibatnya. Kalau kondisinya sudah FALSE sejak awal, badannya dijalankan nol kali:
Dan pemeriksaannya terjadi di antara putaran penuh, bukan di tengah badan: begitu sebuah putaran dimulai, ia berjalan sampai akhir meskipun kondisinya berubah menjadi FALSE di tengah jalan. Kalau kamu perlu keluar di tengah badan, itulah gunanya break (di bawah).
Contoh: Membagi Dua Sampai di Bawah Ambang Batas
Tempat alami while adalah "terus lakukan sampai": kamu tidak bisa tahu sebelumnya berapa putaran yang dibutuhkan, jadi for tidak cocok. Berapa kali kamu bisa membagi dua 1000 sebelum nilainya turun di bawah 1?
Sepuluh kali pembagian, berakhir di sekitar 0.977. Polanya, yaitu variabel state yang dikecilkan oleh badan perulangan dan penghitung yang dinaikkannya, mencakup sebagian besar while loop di dunia nyata: metode numerik yang berjalan sampai galatnya cukup kecil, simulasi yang berjalan sampai sebuah sumber daya habis, percobaan ulang yang berlanjut sampai sebuah panggilan berhasil.
repeat + break: do-while ala R
R tidak punya kata kunci do-while, yaitu perulangan yang menguji kondisinya setelah badan. Tetapi R punya repeat, yang berulang tanpa syarat selamanya, dan break, yang langsung keluar dari perulangan apa pun. Taruh pemeriksaan break di akhir badan repeat, dan kamu sudah membangun do-while yang persis, perulangan yang badannya pasti dijalankan minimal sekali:
Badannya selalu dijalankan sebelum pemeriksaan pertama, jadi n digandakan minimal sekali; perulangannya keluar di 128, penggandaan pertama yang melewati 100. Pakai bentuk ini ketika "lakukan dulu, lalu putuskan apakah perlu diulang" adalah gambaran yang jujur: membaca input sampai valid, mengambil sampel sampai ada yang memenuhi syarat. repeat tanpa break yang bisa dicapai adalah perulangan tanpa akhir sejak awal, jadi tulis break-nya lebih dulu, baru isi badannya.
break bekerja dengan cara yang sama di while dan for loop: ia jalan keluar umum untuk "sudah selesai", dan cocok dipasangkan dengan pernyataan if yang menguji kondisi di tengah badan.
next di Dalam while Loop
next melewati sisa putaran saat ini dan melompat kembali ke pemeriksaan kondisi. Ia bekerja di while sama seperti di for, dengan satu jebakan khusus while: kalau langkah pembaruan berada sesudah next, melewatinya berarti variabel perulangan tidak pernah maju, dan kamu sudah membuat perulangan tanpa akhir. Taruh pembaruannya sebelum next:
Kode ini mencetak bilangan genap 2 sampai 10. Pindahkan i <- i + 1 ke bawah baris next, dan nilai ganjil pertama akan melewati pembaruan selamanya. Di for loop bahaya ini tidak ada (variabel perulangan maju otomatis), satu alasan lagi untuk memilih for ketika kamu hanya menyusuri sebuah barisan.
Mencegah Perulangan Tanpa Akhir
Setiap perulangan tanpa akhir adalah bug yang sama: tidak ada apa pun di badan perulangan yang mengubah variabel yang menjadi dasar kondisinya, atau mengubahnya ke arah yang salah. Secara interaktif kamu bisa menghentikannya dengan Esc atau Ctrl+C, tetapi di dalam script, prosesnya hanya akan menggantung. Dua kebiasaan mencegahnya.
Pertama, ketika menulis kondisinya, langsung tanyakan "baris mana di badan ini yang menggerakkannya menuju FALSE?" dan pastikan baris itu dijalankan di setiap jalur melalui badan perulangan (waspadai jebakan next di atas).
Kedua, untuk perulangan yang sulit dibuktikan akan berhenti, tambahkan pengaman jumlah iterasi maksimum supaya bug logika menghasilkan hasil yang bisa didiagnosis, bukan sesi yang membeku. Di sini pengaman itu melindungi perulangan ala Collatz: bagi dua bilangan genap berulang kali dan ubah x yang ganjil menjadi 3 * x + 1, sampai mencapai 1:
Mulai dari 10, perulangannya mencapai 1 dalam 6 langkah. Kalau ada nilai awal yang tidak pernah mencapai 1, klausa steps < 10000 tetap akan menghentikan perulangan, dan state yang dicetak akan memberitahumu ada yang salah: jawaban salah yang bisa kamu lihat lebih baik daripada program yang tidak pernah menjawab. && yang melakukan short-circuit adalah operator yang tepat di sini: kedua sisinya nilai tunggal, dan pengamannya terbaca sebagai satu kalimat.
while vs for: Memilih
Patokannya bergantung pada apa yang kamu ketahui sebelumnya:
- Kamu tahu apa yang akan diiterasi (elemen sebuah vector, angka 1 sampai n): pakai for loop, karena variabel perulangannya mengurus dirinya sendiri.
- Kamu hanya tahu kondisi berhentinya (sampai konvergen, sampai di bawah ambang batas, sampai valid): pakai
while. - Badannya harus dijalankan minimal sekali sebelum pemeriksaan apa pun masuk akal: pakai
repeatdenganbreaksebagai penghenti.
Kalau kamu sampai mengelola penghitung manual di dalam while loop hanya untuk menyusuri sebuah vector, itu sebenarnya for loop yang sedang menyamar, jadi beralihlah.
Yang Perlu Kamu Ingat
while (condition) { ... }memeriksa dulu, baru berjalan: kondisi yang salah sejak awal berarti nol putaran.- Badan perulangan harus menggerakkan kondisinya menuju
FALSE; trio persiapan / kondisi / pembaruan adalah seluruh disiplinnya. - R tidak punya kata kunci do-while:
repeat { body; if (done) break }adalah idiomnya, yang menjamin minimal satu putaran. breakkeluar dari perulangan apa pun; saat memakainextdi dalamwhile, perbarui variabel perulangan sebelum melewati, atau variabel itu tidak pernah maju.- Pengaman jumlah iterasi maksimum (
&& steps < 10000) mengubah potensi macet menjadi jawaban salah yang terlihat dan bisa di-debug.
Berikutnya: vector, struktur data yang disusuri oleh setiap perulangan di halaman ini, dan alasan banyak perulangan R bisa hilang sepenuhnya.
Pertanyaan yang sering diajukan
Bagaimana cara kerja while loop di R?
while (condition) { ... } memeriksa kondisinya lebih dulu, dan menjalankan badannya hanya selama kondisi itu tetap TRUE. Sesuatu di dalam badan perulangan pada akhirnya harus membuat kondisinya FALSE, biasanya dengan memperbarui penghitung atau mengecilkan sebuah nilai, kalau tidak perulangannya tidak pernah berakhir. Kalau kondisinya FALSE sejak awal, badannya dijalankan nol kali.
Apakah R punya do-while loop?
Tidak sebagai kata kunci. Idiomnya adalah repeat { ...body...; if (condition) break }: repeat berulang tanpa syarat, jadi badannya pasti dijalankan minimal sekali, dan break di akhir berperan sebagai pemeriksaan keluar ala do-while.
Bagaimana cara menghentikan perulangan tanpa akhir di R?
Secara interaktif, tekan Esc (RStudio) atau Ctrl+C (terminal) untuk menghentikannya. Untuk mencegahnya sejak awal: pastikan badan perulangan memperbarui variabel di kondisinya di setiap putaran, dan tambahkan pengaman jumlah iterasi maksimum, while (working && steps < 10000), supaya bug logika menghasilkan hitungan yang salah, bukan sesi yang membeku.