if İfadesi
R'de bir if ifadesi, yalnızca bir koşul TRUE olduğunda bir kod bloğunu çalıştırır. Koşul parantez içine, kod süslü parantez içine gelir ve isteğe bağlı bir else, aksi durumda ne olacağını sağlar:
score >= 60 koşulu tek bir TRUE değerine dönüşür, dolayısıyla ilk dal çalışır. Bu koşulları kurduğunuz şeyler karşılaştırma ve mantıksal operatörlerdir - ==, >=, &&, %in% ve arkadaşları.
İkiden fazla sonuç için kontrolleri else if ile zincirleyin. R zinciri ilk koşuldan aşağı doğru yürür ve koşulu TRUE olan ilk dalı çalıştırıp gerisini atlar:
Sıra önemlidir: 85 >= 80 kontrolü 85 >= 70 kontrolünden önce yapıldığı için not "B" olur. Kontrolleri ters sıralasaydınız 70'in üstündeki her puan "C" alırdı.
Süslü Parantez Tuzağı: else Nereye Gitmeli
Bu, neredeyse herkesin ilk R betiğini ısıran hatadır. Bir betikte (ya da Rscript ile çalıştırılan herhangi bir şeyde) else, kendinden önceki dalın kapanış parantezinin bulunduğu satırda görünmelidir. Bu başarısız olur:
if (score >= 60) {
print("You passed")
}
else { # Error: unexpected 'else'
print("Try again")
}
Nedeni: R ifade ifade ayrıştırır. Bir satırın başındaki } işaretine ulaştığında if ifadesi söz dizimsel olarak tamamlanmıştır ve R onu tam orada değerlendirir. Sonraki satırdaki else yeni bir ifadenin başlangıcı olarak gelir - ve bir ifade else ile başlayamaz. Çözüm, bu sayfa boyunca kullanılan kalıptır:
if (score >= 60) {
print("You passed")
} else { # brace and else on the same line
print("Try again")
}
Bir fonksiyon gövdesinin ya da herhangi bir dış süslü parantez kümesinin içinde bu katı kural gevşer (R dış parantez kapanana kadar okumaya devam eder), ama buna güvenmeyin - } else { stili her yerde çalışır ve R stil rehberlerinin öngördüğü budur.
Koşul Tek Bir TRUE veya FALSE Olmalı
if() tam olarak tek bir mantıksal değer ister. İki şey bunu ihlal eder ve ikisi de hatadır:
if (NA) print("hi")
# Error: missing value where TRUE/FALSE needed
if (c(TRUE, FALSE)) print("hi")
# Error: the condition has length > 1
NA durumu pratikte önemlidir, çünkü eksik veriyle yapılan karşılaştırmalar NA üretir: x NA ise x > 10 de NA'dır ve bu koşulla beslenen bir if betiğinizi durdurur. Savunmacı kalıp, kısa devre yapan && kullanır:
!is.na(x) FALSE olduğu için x > 10 kısmı hiç değerlendirilmez ve koşula hiçbir NA ulaşmaz. NA'nın karşılaştırmalar boyunca nasıl yayıldığı eksik değerler sayfasında ele alınıyor.
Uzunluğun 1'den büyük olması hatası (R 4.2'den beri zorunlu; öncesinde R sessizce ilk elemanı kullanıyordu) genellikle bunlardan birini kastettiğiniz anlamına gelir: tek bir eşleşme yeterliyse any(v > 5), her eleman geçmek zorundaysa all(v > 5) ya da eleman başına yanıt istiyorsanız ifelse() - ki bu da bir sonraki bölüm.
ifelse(): Vektörleştirilmiş If Else
if bir kez karar verir. ifelse(test, yes, no) ise bir vektörün her elemanı için karar verir ve aynı uzunlukta bir vektör döndürür:
temps içindeki her eleman bağımsız olarak test edilir: "hot" "mild" "mild" "hot" "mild". Bu, mevcut birinden yeni bir vektör ya da veri çerçevesi sütunu türetmenin aracıdır - döngüye gerek yok.
if'in aksine ifelse() eksik değerleri zarifçe karşılar: testteki bir NA, hata yerine sonuçta bir NA verir:
Üç yollu ayrımlar için ifelse() çağrılarını iç içe koyabilirsiniz ve bu derinlikte hâlâ okunabilir kalır:
Ama orada durun. Üç ya da daha fazla iç içe ifelse() çağrısı bir parantez eşleştirme bulmacasına dönüşür; o noktada cut() (sayısal aralıklar için) ya da her koşulu kendi satırına yerleştiren dplyr::case_when() fonksiyonuna uzanın.
Çok Yollu Seçimler İçin switch()
Aralık test etmek yerine tek bir değeri bilinen isimler listesiyle eşleştiriyorsanız, uzun bir else if zinciri hantal bir araçtır. switch() bunu doğrudan söyler:
Bilinmesi gereken üç davranış:
- Eşleştirme:
switch(), character değeri argüman isimleriyle karşılaştırır ve eşleşen sonucu döndürür. - Alta düşme: sağ tarafı boş olan bir isim (
sat = ,) bir sonraki durumun sonucuna düşer -"sat"ve"sun"bunu tekrarlamadan"weekend"sonucunu böyle paylaşır. - Varsayılan: hiçbir şey eşleşmediğinde isimsiz son argüman (
"weekday") döndürülür. Varsayılan olmadan eşleşmeyen bir değerswitch()fonksiyonunun görünmez biçimdeNULLdöndürmesine yol açar - fonksiyonunuz sessizce hiçbir şey döndürür ve bu kafa karıştırıcı bir hatadır. Her zaman bir varsayılan verin (ya da onu açık birstop()yapın).
switch(), bir mod ya da metot argümanına göre dağıtım yapan fonksiyonların içinde parlar; sayısal eşiklere dayalı her şey için else if ya da cut() ile kalın.
Buradan Ne Çıkarıyorsunuz
if (condition) { } else { }- koşul parantez içinde, bir dal çalışır;else ifile zincirleyin, ilk eşleşme kazanır.- Betiklerde
} else {şeklinde tek satırda yazın - satır başındakielsebir söz dizimi hatasıdır. if()tam olarak tek birTRUE/FALSEister:NAbir hatadır, daha uzun bir vektör bir hatadır (R 4.2'den beri).!is.na(x) &&ile koruyun ya daany()/all()ile indirgeyin.ifelse(test, yes, no)vektörleştirilmiş sürümdür - yeni vektörler hesaplamak için kullanın ve ikiden fazla iç içe koymayın.switch()isimlere göre çok yollu dağıtımı halleder, boş durumlarla alta düşme sağlar - ona her zaman bir varsayılan verin.
Sırada: bir şeyi birden çok kez yapmak - for döngüleri ve bir döngünün ne zaman doğru araç olduğu (ve olmadığı).
Sıkça Sorulan Sorular
R'de if else ifadesi nasıl yazılır?
if (condition) { ... } else { ... } - koşul parantez içine, her dal süslü parantez içine gelir. Ek kontrolleri else if (condition) ile zincirleyin. Bir betikte else, önceki dalın kapanış parantezinin bulunduğu satırda olmalıdır (} else {); yoksa R unexpected 'else' bildirir.
R'de if ile ifelse() arasındaki fark nedir?
if, tam olarak tek bir TRUE/FALSE değerini test eden ve kodun bir dalını çalıştıran bir akış denetimi ifadesidir. ifelse(test, yes, no) ise vektörleştirilmiş bir fonksiyondur: bir vektörün her elemanını aynı anda test eder ve sonuçlardan oluşan bir vektör döndürür. Programınızın ne yapacağına karar vermek için if, mevcut birinden yeni bir sütun ya da vektör hesaplamak için ifelse() kullanın.
R neden 'the condition has length > 1' diyor?
Tek bir TRUE veya FALSE isteyen if() ifadesine bütün bir vektör geçirdiniz. R 4.2'den beri bu, ilk elemanın sessizce kullanılması yerine bir hatadır. Vektörü tek bir değere indirerek - any(x > 5), all(x > 5) - ya da eleman başına sonuç istiyorsanız vektörleştirilmiş ifelse() fonksiyonuna geçerek düzeltin.
R'de switch() nasıl çalışır?
switch(value, name1 = result1, name2 = result2, default), bir character değeri argüman isimleriyle karşılaştırır ve eşleşen sonucu döndürür. Sağ tarafı boş bırakılan bir isim bir sonraki sonuca düşer, böylece birkaç durum tek bir sonucu paylaşabilir. İsimsiz son argüman varsayılan görevi görür; varsayılan olmadan eşleşmeyen bir değer görünmez biçimde NULL döndürür.