R'de IF, ELSE, ELSE IF ifadesi
⚡ Akıllı Özet
R'deki if-else ve else-if ifadeleri, mantıksal bir koşula bağlı olarak hangi kod bloğunun çalışacağını seçer. Bu kılavuz, iki dallı yapıyı, çok dallı zincirleri, vektörleştirilmiş if-else() fonksiyonunu ve tam eşleşmeler için switch() fonksiyonunu ele almaktadır.
R'deki if-else ifadesi
An eğer başka Bu ifade, bir koşul DOĞRU olduğunda bir kod bloğunu, YANLIŞ olduğunda ise başka bir kod bloğunu çalıştırır. R'da sözdizimi şu şekildedir:
if (condition) { Expr1 } else { Expr2 }
"Quantity" adlı değişkenin 20'nin üzerinde olup olmadığını kontrol edin. Eğer 20'nin üzerindeyse, kod "Çok sattınız!" yazdırır, aksi takdirde "Bugün için yeterli değil" yazdırır.
# Create vector quantity quantity <- 25 # Set the if-else statement if (quantity > 20) { print('You sold a lot!') } else { print('Not enough for today') }
Çıktı:
## [1] "You sold a lot!"
notGirintileme, R'nin kodu çalıştırma şeklini değiştirmez, ancak tutarlı girintileme, uzun bir koşul zincirinin okunabilirliğini sağlar. Ayrıca, kapanış parantezi ve else anahtar kelimesinin aynı satırda olması gerektiğini unutmayın, aksi takdirde R, if bloğunu tamamlanmış olarak kabul eder ve hata verir.
R'deki else if ifadesi
Zincirleme testler devam ediyor aksi takdirdeR'de elif anahtar kelimesi yoktur, yani PythonR'de bu iki kelimeyi ayrı ayrı yazarsınız ve ihtiyacınız kadar dal ekleyebilirsiniz. Sözdizimi şu şekildedir:
if (condition1) { expr1 } else if (condition2) { expr2 } else if (condition3) { expr3 } else { expr4 }
Diyelim ki üç sonuç istiyorsunuz: 20'nin altında "Bugün için yeterli değil", 20 ile 30 arasında "Ortalama bir gün" ve 30'un üzerinde "Ne harika bir gün!" yazdıracak.
Miktar miktarını değiştirmeyi deneyebilirsiniz.
# 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!') }
Çıktı:
## [1] "Not enough for today"
Örnek 2:
KDV oranları ürün kategorisine göre farklılık gösterir. Her birinin kendine özgü bir KDV oranı olan üç kategori düşünün:
| Kategoriler | Ürünler | KDV |
|---|---|---|
| A | Kitap, dergi, gazete vb. | 8% |
| B | Sebze, et, içecek vb. | 10% |
| C | Tişört, jean, pantolon vb. | 20% |
Bir else if zinciri, müşterinin satın aldığı her şeye doğru oranı uygular:
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) }
Çıktı:
## A vat rate of 8% is applied. The total price is 10.8
R'deki ifelse() Vektörleştirilmiş Fonksiyonu
`if` ifadesi yalnızca tek bir değeri ele alır. Ona bir vektör verirseniz, R 4.2 veya sonrası bir hata verir, çünkü koşul tek bir DOĞRU veya YANLIŞ olmalıdır. `ifelse()` fonksiyonu, her öğeyi aynı anda test ederek ve aynı uzunlukta bir vektör döndürerek bu sorunu çözer.
quantities <- c(10, 25, 40, 18) # if cannot do this result <- ifelse(quantities > 20, 'You sold a lot!', 'Not enough for today') result
Çıktı:
## [1] "Not enough for today" "You sold a lot!" "You sold a lot!" ## [4] "Not enough for today"
Üç argüman, test, testin DOĞRU olması durumunda döndürülen değer ve testin YANLIŞ olması durumunda döndürülen değerdir. Her üçü de aynı uzunlukta tekrarlanır.
İç içe if() kullanımı, tüm vektör boyunca bir else if zinciri oluşturur:
ifelse(quantities < 20, 'Not enough for today', ifelse(quantities <= 30, 'Average day', 'What a great day!'))
Bilinmesi gereken iki sınırlama var. ifelse() fonksiyonu, faktör seviyeleri ve Date sınıfı gibi öznitelikleri sonuçtan çıkarır ve her öğe için her iki dalı da değerlendirir; bu nedenle, bir dal maliyetli olduğunda israf olur. dplyr alternatifi durum_ne zaman() İç içe geçmeyi tamamen önler ve türleri olduğu gibi korur:
library(dplyr) case_when( quantities < 20 ~ 'Not enough for today', quantities <= 30 ~ 'Average day', TRUE ~ 'What a great day!' )
R'deki switch() ifadesi
Her dal aynı değişkeni eşitlik açısından test ettiğinde, uzun bir else if zinciri okunması zor hale gelir. switch() ise bunu tek bir arama ile değiştirir.
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)
Davranışını üç kural yönetir:
- Karakter argümanı kullanıldığında, switch() fonksiyonu adı tam olarak eşleştirir. Kısmi eşleştirme veya desen eşleştirme yoktur.
- İsimsiz bir son öğe varsayılan değer görevi görür. Böyle bir öğe olmadığında, eşleşmeyen bir değer görünmez bir şekilde NULL döndürür; bu da sık karşılaşılan sessiz hataların bir kaynağıdır.
- Bir tamsayı argümanı kullanıldığında, switch() işlevi konuma göre seçim yapar: switch(2, “a”, “b”, “c”) “b” değerini döndürür.
Belirli bir değer kümesine karşı tam eşleşmeler için `switch()` yapısını, aralıklar ve bileşik koşullar için ise `else if` yapısını kullanın; çünkü `switch()` bu koşulları ifade edemez. Bir koşulu bir dizi üzerinde tekrar tekrar uygulamak için, onu bir `else if` yapısıyla birleştirin. döngü için ya da döngü sırasında.
mantıksal OperaR koşullarındaki tors
Bir koşulu oluşturan operatörler birbirinden farklı davranırlar ve bu farklılık önemlidir.
| Kullanım | anlam | içinde kullan |
|---|---|---|
| & | Element bazında VE | ifelse(), filter(), tüm vektörler |
| && | Tek değerli VE, kısa devreler | eğer () ve while () |
| | | Eleman bazında VEYA | ifelse(), filter(), tüm vektörler |
| || | Tek değerli VEYA, kısa devreler | eğer () ve while () |
| ! | DEĞİL, testi geçersiz kılar. | Herhangi bir yere |
| %içinde% | Bu kümedeki değer bu mu? | Uzun VEYA zincirlerinin yerini alır. |
Kısa devrelerin önemi. Çift form, cevap kesinleştiği anda durur, bu nedenle sol taraf sonucu zaten belirlemişken sağ taraf asla değerlendirilmez. Bu da bir koruma maddesi yazmayı güvenli hale getirir:
# Safe: length() is checked before x[1] is touched if (length(x) > 0 && x[1] > 10) print('ok')
Çeşitli değerlerle karşılaştırma. Eşitlik testlerini ardı ardına yapmak yerine, hem daha kısa hem de yanlış yazma olasılığı daha düşük olan %in% ifadesini kullanın:
if (category %in% c('A', 'B')) { print('Reduced VAT rate applies') }
Son bir uyarı: Tek bir eşittir işareti değer atar, karşılaştırma yapmaz. Her zaman == işaretini bir koşulun içine yazın.
R'da Koşullu İfadeler: Hızlı Referans
Bu eğitimde kullanılan her yapı aşağıda listelenmiştir:
| Hedef | Code |
|---|---|
| iki dal |
if (cond) { a } else { b } |
| Birden fazla dal |
if (c1) { a } else if (c2) { b } else { c } |
| Vektörleştirilmiş durum |
ifelse(test, yes, no)
|
| Vektör üzerinde çok dallı yapı |
case_when(c1 ~ a, c2 ~ b, TRUE ~ c)
|
| Tam eşleşme araması |
switch(x, "A" = 1, "B" = 2, 0) |
| Üyelik testi |
if (x %in% c("A", "B")) { } |


