Pernyataan IF, ELSE, ELSE IF pada R
⚡ Ringkasan Cerdas
Pernyataan If Else dan Else If di R memilih blok kode mana yang akan dijalankan berdasarkan kondisi logis. Panduan ini mencakup bentuk dua cabang, rantai multi-cabang, fungsi ifelse() yang di-vektorisasi, dan switch() untuk pencocokan yang tepat.
Pernyataan if else di R
An jika lagi Pernyataan tersebut menjalankan satu blok kode ketika suatu kondisi BENAR dan blok kode lain ketika kondisi tersebut SALAH. Dalam R, sintaksnya adalah:
if (condition) { Expr1 } else { Expr2 }
Periksa apakah variabel bernama quantity lebih besar dari 20. Jika ya, kode akan mencetak "Anda menjual banyak!", jika tidak, kode akan mencetak "Tidak cukup untuk hari ini".
# Create vector quantity quantity <- 25 # Set the if-else statement if (quantity > 20) { print('You sold a lot!') } else { print('Not enough for today') }
Keluaran:
## [1] "You sold a lot!"
NoteIndentasi tidak mengubah cara R menjalankan kode, tetapi indentasi yang konsistenlah yang membuat rangkaian kondisi yang panjang tetap mudah dibaca. Perhatikan juga bahwa tanda kurung kurawal penutup dan kata kunci else harus berada pada baris yang sama, jika tidak, R akan menganggap blok if sudah lengkap dan menampilkan kesalahan.
Pernyataan else if di R
Rantai melakukan pengujian lebih lanjut dengan lain jikaR tidak memiliki kata kunci elif, yaitu PythonDi R, Anda menulis kedua kata tersebut secara terpisah, dan Anda dapat menambahkan cabang sebanyak yang Anda butuhkan. Sintaksnya adalah:
if (condition1) { expr1 } else if (condition2) { expr2 } else if (condition3) { expr3 } else { expr4 }
Misalkan Anda menginginkan tiga hasil: di bawah 20 cetakan "Tidak cukup untuk hari ini", antara 20 dan 30 cetakan "Hari biasa", dan di atas 30 cetakan "Hari yang luar biasa!".
Anda dapat mencoba mengubah jumlah kuantitasnya.
# Create the variable quantity quantity <- 10 # Create multiple condition statement if (quantity < 20) { print('Not enough for today') } else if (quantity >= 20 & quantity <= 30) { print('Average day') } else { print('What a great day!') }
Keluaran:
## [1] "Not enough for today"
Contoh 2:
Tarif PPN berbeda-beda menurut kategori produk. Bayangkan ada tiga kategori, masing-masing dengan tarifnya sendiri:
| KATEGORI | Produk | PPN |
|---|---|---|
| A | Buku, majalah, koran, dll. | 8% |
| B | Sayuran, daging, minuman, dll. | 10% |
| C | Kaos oblong, jean, celana, dll. | 20% |
Rangkaian else if menerapkan tarif yang benar untuk apa pun yang dibeli pelanggan:
category <- 'A' price <- 10 if (category =='A'){ cat('A vat rate of 8% is applied.','The total price is',price *1.08) } else if (category =='B'){ cat('A vat rate of 10% is applied.','The total price is',price *1.10) } else { cat('A vat rate of 20% is applied.','The total price is',price *1.20) }
Keluaran:
## A vat rate of 8% is applied. The total price is 10.8
Fungsi ifelse() yang Divektorisasi di R
Pernyataan if hanya menangani satu nilai. Jika diberikan vektor, R 4.2 atau versi yang lebih baru akan menampilkan kesalahan, karena kondisinya harus berupa TRUE atau FALSE tunggal. Fungsi ifelse() mengatasi hal ini dengan menguji setiap elemen sekaligus dan mengembalikan vektor dengan panjang yang sama.
quantities <- c(10, 25, 40, 18) # if cannot do this result <- ifelse(quantities > 20, 'You sold a lot!', 'Not enough for today') result
Keluaran:
## [1] "Not enough for today" "You sold a lot!" "You sold a lot!" ## [4] "Not enough for today"
Tiga argumen tersebut adalah pengujian, nilai yang dikembalikan jika pengujian bernilai BENAR, dan nilai yang dikembalikan jika pengujian bernilai SALAH. Ketiga argumen tersebut diulang hingga memiliki panjang yang sama.
Penggunaan ifelse() bersarang akan mereproduksi rangkaian else if di seluruh vektor:
ifelse(quantities < 20, 'Not enough for today', ifelse(quantities <= 30, 'Average day', 'What a great day!'))
Ada dua batasan yang perlu diketahui. Fungsi ifelse() menghilangkan atribut seperti level faktor dan kelas Date dari hasilnya, dan mengevaluasi kedua cabang untuk setiap elemen, sehingga boros ketika salah satu cabang mahal. Alternatifnya adalah dplyr. kasus_ketika() menghindari penestingan sepenuhnya dan menjaga tipe tetap utuh:
library(dplyr) case_when( quantities < 20 ~ 'Not enough for today', quantities <= 30 ~ 'Average day', TRUE ~ 'What a great day!' )
Pernyataan switch() di R
Ketika setiap cabang menguji variabel yang sama untuk kesamaan, rantai else if yang panjang menjadi sulit dibaca. switch() menggantinya dengan satu pencarian tunggal.
category <- 'A' price <- 10 vat <- switch(category, 'A' = 1.08, 'B' = 1.10, 'C' = 1.20, 1.20) # the unnamed last value is the default cat('The total price is', price * vat)
Tiga aturan mengatur perilakunya:
- Dengan argumen karakter, switch() mencocokkan nama secara persis. Tidak ada pencocokan sebagian dan tidak ada pencocokan pola.
- Elemen akhir tanpa nama bertindak sebagai nilai default. Tanpa elemen tersebut, nilai yang tidak cocok akan mengembalikan NULL secara tidak terlihat, yang merupakan sumber umum dari bug yang tidak terdeteksi.
- Dengan argumen bilangan bulat, switch() memilih berdasarkan posisi: switch(2, “a”, “b”, “c”) mengembalikan “b”.
Gunakan switch() untuk pencocokan persis terhadap sekumpulan nilai tetap, dan simpan else if untuk rentang dan kondisi gabungan, yang tidak dapat diungkapkan oleh switch(). Untuk menerapkan suatu kondisi berulang kali pada suatu urutan, gabungkan dengan sebuah kondisi. untuk loop atau loop sementara.
logis Operators dalam Kondisi R
Operator yang membentuk suatu kondisi berperilaku berbeda satu sama lain, dan perbedaan itu penting.
| Operator | Arti | Gunakan di |
|---|---|---|
| & | Elemen demi elemen DAN | ifelse(), filter(), seluruh vektor |
| && | AND nilai tunggal, hubung singkat | jika () dan sementara () |
| | | OR per elemen | ifelse(), filter(), seluruh vektor |
| || | OR nilai tunggal, hubung singkat | jika () dan sementara () |
| ! | TIDAK, meniadakan pengujian | Di manapun |
| %di dalam% | Apakah nilainya ada dalam himpunan ini? | Menggantikan rantai ruang operasi yang panjang |
Mengapa korsleting itu penting. Bentuk ganda berhenti segera setelah jawabannya ditetapkan, sehingga sisi kanan tidak pernah dievaluasi ketika sisi kiri sudah menentukan hasilnya. Hal itu membuat penulisan klausa pengaman menjadi aman:
# Safe: length() is checked before x[1] is touched if (length(x) > 0 && x[1] > 10) print('ok')
Membandingkan dengan beberapa nilai. Gunakan %in% daripada melakukan pengujian kesamaan berantai, karena lebih singkat dan lebih kecil kemungkinannya untuk salah ketik:
if (category %in% c('A', 'B')) { print('Reduced VAT rate applies') }
Satu peringatan terakhir: tanda sama dengan (=) tunggal hanya menetapkan nilai, bukan membandingkan. Selalu tulis == di dalam sebuah kondisi.
Pernyataan Bersyarat dalam R: Referensi Cepat
Setiap konstruksi yang digunakan dalam tutorial ini tercantum di bawah ini:
| Tujuan | Code |
|---|---|
| Dua cabang |
if (cond) { a } else { b } |
| Banyak cabang |
if (c1) { a } else if (c2) { b } else { c } |
| Kondisi tervektorisasi |
ifelse(test, yes, no)
|
| Banyak cabang pada vektor |
case_when(c1 ~ a, c2 ~ b, TRUE ~ c)
|
| Pencarian kecocokan persis |
switch(x, "A" = 1, "B" = 2, 0) |
| Tes keanggotaan |
if (x %in% c("A", "B")) { } |


