Menu

If else di R: if, else if, ifelse(), dan switch()

Percabangan di R: sintaks if/else if/else, jebakan kurung kurawal yang merusak skrip, ifelse() yang tervektorisasi untuk seluruh vector, dan switch() untuk pilihan bercabang banyak.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

Pernyataan if

Pernyataan if di R menjalankan sebuah blok kode hanya saat kondisinya TRUE. Kondisinya ditaruh di dalam tanda kurung, kodenya di dalam kurung kurawal, dan else yang opsional menentukan apa yang terjadi kalau tidak:

Kondisi score >= 60 dievaluasi menjadi satu TRUE, jadi cabang pertama dijalankan. Operator perbandingan dan logika (==, >=, &&, %in%, dan kawan-kawannya) adalah bahan untuk menyusun kondisi-kondisi ini.

Untuk lebih dari dua kemungkinan hasil, rangkai pemeriksaan dengan else if. R menelusuri rangkaian itu dari kondisi pertama ke bawah dan menjalankan cabang pertama yang kondisinya TRUE, lalu melewati sisanya:

Urutan itu penting: karena 85 >= 80 diperiksa sebelum 85 >= 70, nilainya "B". Kalau kamu mengurutkan pemeriksaannya sebaliknya, setiap skor di atas 70 akan mendapat "C".

Jebakan kurung kurawal: di mana else harus ditaruh

Inilah error yang menggigit hampir setiap skrip R pertama. Di skrip (atau apa pun yang dijalankan dengan Rscript), else harus muncul di baris yang sama dengan kurung kurawal penutup cabang sebelumnya. Ini gagal:

if (score >= 60) {
  print("You passed")
}
else {              # Error: unexpected 'else'
  print("Try again")
}

Alasannya: R mengurai kode pernyataan demi pernyataan. Saat sampai di } di awal baris, pernyataan if sudah lengkap secara sintaks, dan R langsung mengevaluasinya saat itu juga. else di baris berikutnya datang sebagai awal pernyataan baru, padahal sebuah pernyataan tidak bisa diawali dengan else. Solusinya adalah pola yang dipakai di sepanjang halaman ini:

if (score >= 60) {
  print("You passed")
} else {            # brace and else on the same line
  print("Try again")
}

Di dalam isi fungsi atau sepasang kurung kurawal luar mana pun, aturan ketat ini melonggar (R terus membaca sampai kurung kurawal luarnya ditutup), tapi jangan mengandalkannya: gaya } else { bekerja di mana saja dan itulah yang dianjurkan panduan gaya R.

Kondisinya harus satu TRUE atau FALSE

if() menuntut tepat satu nilai logika. Ada dua hal yang melanggarnya, dan keduanya error:

if (NA) print("hi")
# Error: missing value where TRUE/FALSE needed

if (c(TRUE, FALSE)) print("hi")
# Error: the condition has length > 1

Kasus NA penting dalam praktik karena perbandingan dengan data yang hilang menghasilkan NA: kalau x bernilai NA, maka x > 10 adalah NA, dan if yang diberi kondisi itu menghentikan skripmu. Pola pertahanannya memakai && yang short-circuit:

Karena !is.na(x) bernilai FALSE, bagian x > 10 tidak pernah dievaluasi dan tidak ada NA yang sampai ke kondisi. Cara NA menyebar melalui perbandingan dibahas di nilai yang hilang.

Error panjang lebih dari 1 (diberlakukan sejak R 4.2; sebelumnya R diam-diam memakai elemen pertama) biasanya berarti kamu sebenarnya memaksudkan salah satu dari ini: any(v > 5) kalau satu kecocokan sudah cukup, all(v > 5) kalau setiap elemen harus lolos, atau ifelse() kalau kamu menginginkan jawaban per elemen, yang dibahas di bagian berikutnya.

ifelse(): if else yang tervektorisasi

if memutuskan sekali. ifelse(test, yes, no) memutuskan untuk setiap elemen vector dan mengembalikan vector dengan panjang yang sama:

Setiap elemen temps diuji secara terpisah: "hot" "mild" "mild" "hot" "mild". Inilah alat untuk menurunkan vector atau kolom data frame baru dari yang sudah ada, tanpa perlu loop.

Tidak seperti if, ifelse() menangani nilai yang hilang dengan anggun: NA di dalam uji menghasilkan NA di hasilnya, bukan error:

Kamu bisa menyarangkan pemanggilan ifelse() untuk pembagian tiga arah, dan pada kedalaman itu kodenya masih mudah dibaca:

Tapi berhentilah di situ. Tiga atau lebih pemanggilan ifelse() bersarang berubah menjadi teka-teki mencocokkan kurung; pada titik itu, pakai cut() (untuk rentang numerik) atau dplyr::case_when(), yang menaruh setiap kondisi di barisnya sendiri.

switch() untuk pilihan bercabang banyak

Saat kamu mencocokkan satu nilai dengan daftar nama yang sudah diketahui (bukan menguji rentang), rangkaian else if yang panjang adalah alat yang canggung. switch() mengatakannya secara langsung:

Tiga perilaku yang perlu diketahui:

  • Pencocokan: switch() membandingkan nilai character dengan nama-nama argumen dan mengembalikan hasil yang cocok.
  • Fall-through: nama dengan sisi kanan kosong (sat = ,) jatuh ke hasil kasus berikutnya; begitulah "sat" dan "sun" berbagi "weekend" tanpa mengulangnya.
  • Default: argumen terakhir tanpa nama ("weekday") dikembalikan saat tidak ada yang cocok. Tanpa default, nilai yang tidak cocok membuat switch() mengembalikan NULL secara tak terlihat: fungsimu diam-diam tidak mengembalikan apa-apa, bug yang membingungkan. Selalu berikan default (atau jadikan stop() yang eksplisit).

switch() bersinar di dalam fungsi yang memilih perilaku berdasarkan argumen mode atau method; untuk apa pun yang berdasarkan ambang numerik, tetap pakai else if atau cut().

Yang kamu bawa pulang

  • if (condition) { } else { }: kondisi di dalam tanda kurung, satu cabang dijalankan; rangkai dengan else if, kecocokan pertama yang menang.
  • Di skrip, tulis } else { dalam satu baris; else di awal baris adalah error sintaks.
  • if() butuh tepat satu TRUE/FALSE: NA adalah error, vector yang lebih panjang adalah error (sejak R 4.2). Lindungi dengan !is.na(x) &&, atau ringkas dengan any()/all().
  • ifelse(test, yes, no) adalah versi tervektorisasi; pakai untuk menghitung vector baru, dan jangan menyarangkannya lebih dari dua kali.
  • switch() menangani pilihan bercabang banyak berdasarkan nama, dengan fall-through lewat kasus kosong; selalu berikan default.

Berikutnya: melakukan sesuatu lebih dari sekali, yaitu for loop, dan kapan loop adalah alat yang tepat (dan kapan bukan).

Pertanyaan yang sering diajukan

Bagaimana cara menulis pernyataan if else di R?

if (condition) { ... } else { ... }: kondisinya ditaruh di dalam tanda kurung dan setiap cabang di dalam kurung kurawal. Rangkai pemeriksaan berikutnya dengan else if (condition). Di skrip, else harus berada di baris yang sama dengan kurung kurawal penutup cabang sebelumnya (} else {), kalau tidak R melaporkan unexpected 'else'.

Apa perbedaan if dan ifelse() di R?

if adalah pernyataan alur kontrol yang menguji tepat satu nilai TRUE/FALSE dan menjalankan satu cabang kode. ifelse(test, yes, no) adalah fungsi tervektorisasi: fungsi ini menguji setiap elemen vector sekaligus dan mengembalikan vector berisi hasilnya. Pakai if untuk menentukan apa yang dilakukan programmu; pakai ifelse() untuk menghitung kolom atau vector baru dari yang sudah ada.

Kenapa R mengatakan 'the condition has length > 1'?

Kamu memberikan seluruh vector ke if(), padahal fungsi itu butuh satu TRUE atau FALSE. Sejak R 4.2, ini menjadi error, bukan lagi diam-diam memakai elemen pertama. Perbaiki dengan meringkas vector menjadi satu nilai (any(x > 5), all(x > 5)) atau dengan beralih ke ifelse() yang tervektorisasi kalau kamu menginginkan hasil per elemen.

Bagaimana cara kerja switch() di R?

switch(value, name1 = result1, name2 = result2, default) membandingkan sebuah nilai character dengan nama-nama argumen dan mengembalikan hasil yang cocok. Nama dengan sisi kanan kosong akan jatuh ke hasil berikutnya, sehingga beberapa kasus bisa berbagi satu hasil. Argumen terakhir tanpa nama berfungsi sebagai default; tanpanya, nilai yang tidak cocok mengembalikan NULL secara tak terlihat.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai