R'nin Size Verdiği Operatörler
R'nin operatörleri dört çalışma grubuna ayrılır: aritmetik (+ - * / ^ %% %/%), karşılaştırma (== != < <= > >=), mantıksal (& | && || ! xor) ve üyelik testi %in%. Onları çoğu dilden ayıran iki şey vardır: neredeyse hepsi vektörleştirilmiştir - bütün vektörler üzerinde eleman eleman çalışırlar - ve R'de birbirinin yerine geçmeyen iki VE operatörü ile iki VEYA operatörü vardır. Bu sayfa hepsini ve sessizce yanlış yanıtlar üreten öncelik tuzaklarını ele alıyor.
Aritmetik: +, -, *, /, ^, %% ve %/%
İlk beşi beklediğiniz şeyi yapar. Yüzde işaretiyle sarılı ikisi - %% (mod, kalan) ve %/% (tam sayı bölmesi, bölüm) - insanların arattığı olanlardır:
/ işlecinin her zaman kayan noktalı bölme yaptığına dikkat edin - 17 / 5 sonucu 3.4'tür, asla 3 değil. Tam sayı kısmını istiyorsanız %/% tam da bunun içindir.
%% işlecinin gündelik işi bölünebilirliktir. Bir sayı, 2'ye bölündüğünde kalan bırakmıyorsa çifttir:
O ikinci satır duraklamaya değer: negatif bir işlenenle R'nin %% işleci bölenin işaretini taşıyan bir sonuç döndürür (-7 %% 3 sonucu 2'dir, çünkü -7 = -3 * 3 + 2). Bazı diller bunu diğer türlü yapar; kod taşıyorsanız kontrol edin.
Karşılaştırma Operatörleri Vektörleştirilmiştir
==, !=, <, <=, >, >= eleman eleman karşılaştırır ve tek bir yanıt değil, bir logical vektör döndürür:
R'deki neredeyse tüm filtrelemenin arkasındaki motor budur - bütün bir vektörü bir değerle karşılaştırır, bir mantıksal maske alır ve alt küme almak için maskeyi kullanırsınız. Ondalıklarda == ile ilgili bir uyarı: kayan noktalı sayılar yaklaşık olarak saklanır, dolayısıyla 0.1 + 0.2 == 0.3 sonucu FALSE'tur. Ondalık karşılaştırmalarda all.equal() tercih edin ya da abs(x - y) < 1e-9 kontrolü yapın.
Mantıksal Operatörler: & ve && (Klasik Karışıklık)
R'de iki VE operatörü ve iki VEYA operatörü vardır; yanlışını seçmek bir erginlenme törenidir.
& ve | vektörleştirilmiştir. İki logical vektörü eleman eleman birleştirirler:
Veri üzerinde bir filtre kurarken bunları kullanın: df[df$age > 30 & df$city == "Lisbon", ].
&& ve || skalerdir ve kısa devre yapar. Tek değerler alır, tek bir TRUE/FALSE döndürür ve ilki yanıtı çoktan belirlemişse ikinci işleneni tamamen atlarlar:
O ikinci satır kısa devreyi gösterir: x < 0 FALSE olduğu için R stop() çağrısını hiç değerlendirmez. && işlecinin if() koşullarına ait olmasının nedeni tam da budur - if (!is.na(x) && x > 10) yazabilirsiniz ve x NA olduğunda x > 10 kısmı güvenle atlanır.
Genel kural: vektörler ve veri filtreleme için &/|, if() koşulları için &&/||. Ve R 4.3'ten beri bu dişlerle uygulanıyor: && veya || işlecine uzunluğu 1'den büyük bir vektör vermek bir hatadır (eski R sürümleri sessizce yalnızca ilk elemanı kullanıyordu ve bu yıllarca gerçek hataları gizledi).
xor(a, b) kümeyi tamamlar - ikisinden tam olarak biri TRUE olduğunda TRUE'dur:
%in%: Üyelik Testi
x %in% table, x içindeki her eleman için "bu, table içinde herhangi bir yerde geçiyor mu?" diye sorar. Gerçek R kodunda en çok kullanılan operatörlerden biridir:
Test edilen taraf bütün bir vektör olabilir; bu da %in% işlecini satırları izin verilen bir değer kümesine göre filtrelemenin doğal aracı yapar.
Ayrıca yoksa yazacağınız alternatifi de geride bırakır - | ile birbirine yapıştırılmış bir == zinciri:
Beş izinli değerle == zinciri bir tekrar duvarına dönüşür; %in% sürümünde ise yalnızca vektör büyür. İkinci, daha ince bir avantajı da vardır - %in% asla NA döndürmez:
NA == 1 sonucu NA'dır, çünkü R bilinmeyen bir değerin 1'e eşit olup olmadığını bilemez - bu davranış eksik değerler sayfasında derinlemesine ele alınıyor. O NA daha sonra ulaştığı her if() ifadesini zehirler. %in% her zaman TRUE ya da FALSE yanıtı vererek sorunun tamamını atlatır; eksik olabilecek veri üzerindeki koşullar için daha güvenli seçim olmasının nedeni budur.
Öncelik Tuzakları
İki operatör önceliği tuzağı, "R bozuk" anlarının orantısız bir kısmını oluşturur. Birincisi, ^ tekli eksiden daha sıkı bağlar:
İkincisi, iki nokta üst üste ikili aritmetikten daha sıkı bağlar:
Şüphedeyseniz parantez ekleyin. Bir maliyetleri yoktur ve her okur (gelecekteki siz dahil) onları yorumlayıcıyla aynı şekilde ayrıştırır.
$ ve [ ]: Erişim Operatörleri
Sürekli olarak $, [ ] ve [[ ]] de göreceksiniz - teknik olarak bunlar da operatördür ve hesaplama yapmak yerine yapılardan değer çekmek için kullanılırlar:
Bunlar vektörler, listeler ve veri çerçeveleri sayfalarında tam olarak ele alınıyor - burada onları aynı operatör ailesinin üyeleri olarak tanımak yeterli.
Buradan Ne Çıkarıyorsunuz
%%kalanı,%/%tam bölümü verir;x %% 2 == 0çift olmayı test eder.- Karşılaştırmalar vektörleştirilmiştir - filtreleyebileceğiniz bir logical vektör döndürürler.
&/|vektörleri eleman eleman birleştirir;&&/||if()içindeki tek değerler içindir ve kısa devre yapar. R 4.3'ten beri daha uzun bir vektörde&&bir hatadır.x %in% table, zincirlenmiş==ifadelerinin yerine geçer ve aslaNAdöndürmez.-2^2sonucu-4'tür ve1:n - 1sıfırdan başlar - şüphedeyseniz parantez kullanın.
Sırada: bu operatörleri if, else ve ifelse() içinde iş başına koymak - R'nin koşul ifadeleri.
Sıkça Sorulan Sorular
R'de %% ne yapar?
%% mod operatörüdür - bir bölmenin kalanını döndürür. 17 %% 5 sonucu 2'dir. Eşi olan %/% tam sayı bölmesi yapar ve kalansız bölümü döndürür: 17 %/% 5 sonucu 3'tür. %% işlecinin klasik kullanımı çift sayı testidir: x %% 2 == 0.
R'de & ile && arasındaki fark nedir?
& vektörleştirilmiştir: iki vektörü eleman eleman karşılaştırır ve aynı uzunlukta bir vektör döndürür. && yalnızca tek değerlerle çalışır, kısa devre yapar (ilk işlenen sonucu belirliyorsa ikinciyi atlar) ve tam olarak tek bir TRUE ya da FALSE döndürür. Vektörleri filtrelerken &, if() koşullarının içinde && kullanın. R 4.3'ten beri && veya || işlecine 1'den uzun bir vektör vermek uyarı değil hatadır.
R'de %in% ne yapar?
x %in% table, x içindeki her elemanın table içinde herhangi bir yerde geçip geçmediğini test eder ve eleman başına TRUE ya da FALSE döndürür. "mango" %in% basket, | ile birleştirilmiş bir == zincirinin yerine geçer ve =='in aksine asla NA döndürmez - test edilen tarafta eksik bir değer olması yalnızca FALSE verir.
R'de -2^2 neden -4 döndürür?
^ operatörü tekli eksiden daha sıkı bağladığı için R -2^2 ifadesini -(2^2) olarak okur ve bu da -4'tür. Eksi ikinin karesini kastediyorsanız (-2)^2 yazın; sonuç 4 olur. İki nokta üst üstenin de benzer bir tuzağı vardır: 1:n - 1, 1:(n - 1) değil (1:n) - 1 anlamına gelir.