Bölüm3 Koşullar ve Akış Kontrolleri
3.1 Eşitlikler, Büyüklük ve Küçüklük Kontrolleri
En temel karşılaştırma eşitlik kontrolüdür. Eşitlik kontrolleri için kodlar ve anlamları aşağıdaki gibidir.
- == eşitlik
- != eşit değil
- <= küçük eşit ve >= büyük eşit
Aşağıdaki ifadelerin eşitliklerini konsolunuza yazarak kontrol edin
5 == (2 + 3)
"elma" != "armut"
TRUE != FALSE
"gençlerbirliği" != "gençlerbirliği"
Nümerik değerler eşitlik kontrolü
5 == (2 + 3)
## [1] TRUE
Karakter eşitlik kontrolü
"gençlerbirliği" != "gençlerbirliği"
## [1] FALSE
Büyüklük veya küçüklük kontrolleri
(1 + 2) > 4
## [1] FALSE
"köpek" < "balık"
## [1] FALSE
TRUE <= FALSE
## [1] FALSE
Görüldüğü üzere R gerekli karşılaştırmaları yaptıktan sonra çıktıları TRUE veya FALSE cinsinden bize aktarmaktadır. Büyüklük küçüklük kontrollerinde eğer kontrol edilen değişken string cinsinden ise, yani harf ile ifade edilmişse, R alfabetik sırayı dikkate alarak işlemini yapar. Yukarıdaki “köpek” < “balık” kontrolünde “b” harfi “k” harfinden önce geldiğinden küçüktür, dolayısıyla karşılaştırma sonucu FALSE yani yanlış olarak karşımıza çıkar. Benzer bir şekilde R TRUE mantıksal değerine nümerik olarak 1, FALSE mantıksal değerine de nümerik olarak 0 değeri atadığından “TRUE<=FALSE” ifadesini “1<=0” olarak değerlendirip, neticeyi FALSE yani yanlış olarak raporlar.
3.2 Vektör Karşılaştırmaları
R dilinin vektörler konusundaki yeteneklerini öğrenmiştik. Yazım kurallarını değiştirmeden yukarıdaki kontrolleri aynen vektörleri karşılaştırmak için de kullanabiliriz. iki futbol takımının geçtiğimiz 7 hafta boyunca attıkları golleri belirten iki vektör yaratalım.
genclerbirligi <- c(4, 3, 0, 2, 0, 5, 1)
ankaragucu <- c(5, 1, 0, 2, 3, 2, 1)
Acaba hangi haftalarda Gençlerbirliği 1’den fazla gol attı?
genclerbirligi > 1
## [1] TRUE TRUE FALSE TRUE FALSE TRUE FALSE
Görüldüğü Gençlerbirliği’nin 1 den fazla gol attığı haftaları R “TRUE” değeri ile raporladı.
Acaba hangi haftalarda Gençlerbirliği 2 veya daha az gol attı?
genclerbirligi <= 2
## [1] FALSE FALSE TRUE TRUE TRUE FALSE TRUE
Peki hangi haftalarda Gençlerbirliği Ankaragücü’nden fazla gol atmış?
genclerbirligi > ankaragucu
## [1] FALSE TRUE FALSE FALSE FALSE TRUE FALSE
Yukarıdaki sonuca göre Gençlerbirliği ikinci ve altıncı haftalarda Ankaragücü’nden fazla gol atmıştır.
3.3 Matris Karşılaştırmaları
R ile matrisleri de birbiri ile karşılaştırabiliriz. Yukarıdaki örnekteki vektörlerimizi bir matris olarak tanımlayalım.
goller <- matrix(c(genclerbirligi, ankaragucu), nrow=2, byrow=TRUE)
Ne zaman her iki takım da 2 gol atmış?
goller == 2
## [,1] [,2] [,3] [,4] [,5] [,6] [,7]
## [1,] FALSE FALSE FALSE TRUE FALSE FALSE FALSE
## [2,] FALSE FALSE FALSE TRUE FALSE TRUE FALSE
Ne zaman her iki takım da 3 veya daha fazla gol atmış?
goller >= 3
## [,1] [,2] [,3] [,4] [,5] [,6] [,7]
## [1,] TRUE TRUE FALSE FALSE FALSE TRUE FALSE
## [2,] TRUE FALSE FALSE FALSE TRUE FALSE FALSE
Sonuçlardan da anlaşılacağı üzere R verilen karşılaştırma komutlarını martiksler üzerinden de gerçekleştirebilmektedir.
3.4 Mantıksal Operatörler
Yukarıdaki kontrolleri birleştirmek istediğimizde mantıksal operatörlere gereksinim doğar. R bu işlemi aşağıdaki mantıksal operatörleri kullanarak gerçekleştirir.
- & (ve operatörü)
- | (veya operatörü)
- ! (değil operatörü)
Ve (&) operatörü TRUE ve FALSE olarak iki değer alır ve karşılaştırılanların her ikisinin de TRUE değeri alması halinde TRUE değerini raporlar, diğer tüm seçenekler FALSE olarak raporlanır
TRUE & TRUE
## [1] TRUE
TRUE & FALSE
## [1] FALSE
FALSE & TRUE
## [1] FALSE
FALSE & FALSE
## [1] FALSE
Başka bir örnek vermek gerekirse
x <- 15
x > 7 & x < 16
## [1] TRUE
Her iki koşul da yerine getirildiğinden (15 > 7 ve 15 < 16) R sonucu TRUE yani doğru olarak raporladı.
Veya (|) operatörü de benzer bir mantık ile çalışır. Ve (&) operatöründen tek farkı her iki koşuldan birinin doğru olması, sonucun TRUE olarak raporlanmasına yetiyor olmasıdır.
y <- 4
y < 5 | y > 15
## [1] TRUE
Görüldüğü üzere tek bir koşulun doğru olması (4 < 5) sonucun TRUE olarak raporlanmasına yol açtı.
Değil (!) operatörü ise üstünde kullanıldığı değerin aksini test eder.
!(x < 17)
## [1] FALSE
x değerinin 15 olduğunu hatırlayın. Parantez içindeki test TRUE sonucunu verecekken, başındaki değil (!) operatörü ile sonuç FALSE olarak raporlandı.
Mantıksal operatörler aynı yöntemler ile vektörleri de karşılaştırmak için de kullanılır.
3.5 Ve (&) ve Veya (|) Operatörleri
Goller ile ilgili örneğimize geri dönelim. Bu sefer Gençlerbirliği’nin son haftada attığı gol sayısını “son_hafta” isimli bir değişken haline getirip incelemelerimizi yapacağız.
son_hafta <- tail(genclerbirligi, 1)
Son hafta Gençlerbirliği’nin attığı gol sayısı 2’den az veya 3’den fazla mı?
son_hafta < 2 | son_hafta > 3
## [1] TRUE
Vektörü kontrol ettiğimizde Gençlerbirliği’nin son hafta 1 gol attığını görebiliriz. Yukarıdaki örnekte veya (|) operatörü kullanıldığından tek bir koşul da sağlansa sonuç TRUE olarak raporlanacaktır. Nitekim de böyle olmuştur: (|) operatörünün sol kısmındaki denklem bu koşulu sağlar.
Gençlerbirliği’nin 2 üstü ve Ankaragücü’nün 1 gol attığı hafta var mı?
genclerbirligi > 2 & ankaragucu ==1
## [1] FALSE TRUE FALSE FALSE FALSE FALSE FALSE
Rapora göre test ettiğimiz durum sadece 2. haftada gerçekleşmiş görünüyor.
Benzer işlemi matrisler için de yapabiliriz. Ne zaman her iki takım da 1 gol üstü ve 3 gol altı atmış?
goller > 1 & goller < 3
## [,1] [,2] [,3] [,4] [,5] [,6] [,7]
## [1,] FALSE FALSE FALSE TRUE FALSE FALSE FALSE
## [2,] FALSE FALSE FALSE TRUE FALSE TRUE FALSE
3.6 Koşullu Önermeler: Eğer (if) önermesi
R dilinde (if) sıklıkla kullanılan bir koşuldur ve yazım şekli aşağıdaki gibidir.
if (koşulumuz) {
çıktı
}
R bu yazımı kontrol eder ve eğer koşul sağlanıyorsa isteğimizi karşılar. Futbol takımlarımızla ilgili örneğimizdeki ilk hafta değerlerini kullanarak iki değişken yaratalım ve bunları bir örnekte kullanalım
takim <- "genclerbirligi"
ilk_hafta_gol <- 4
Bilgisayara eğer futbol takımı Gençlerbirliği ise (koşul) “Kızıl-Kara-Burası-Ankara” yazmasını (sonuç) söylemek istersek
if (takim =="genclerbirligi") {
print ("Kızıl-Kara-Burası-Ankara")
}
## [1] "Kizil-Kara-Burasi-Ankara"
3.7 Koşullu Önermeler: Diğer (else) önermesi
Diğer (else) önermesi, eğer (if) önermesi ile kullanıldığında, eğer (if) ile yapılan kontrol FALSE sonucunu verdiğinde ne yapılacağını tanımlar. Eğer (if) önermesinin koşulunu kullanır, ayrıca bir koşul tanımlanmasına gerek yoktur. Yazımı aşağıdaki gibidir
if (koşulumuz) {
çıktı1
} else {
çıktı2
}
Yazımda “else”" kelimesinin “if” kısmını kapatan ayraç ile aynı satırda olmasına dikkat ediniz.
Yukarıdaki örneğimize bir diğer (else) ifadesi eklersek
if (takim =="genclerbirligi") {
print ("Kızıl-Kara-Burası-Ankara")
} else {
print ("Başka takım")
}
## [1] "Kizil-Kara-Burasi-Ankara"
Koşulumuzu Gençlerbirliği’nden çınarcıkspor’a değiştirdiğimizde…
if (takim =="çınarcıkspor") {
print ("Kızıl-Kara-Burası-Ankara")
} else {
print ("Başka takım")
}
## [1] "Baska takim"
3.8 Koşullu Önermeler: Diğer-eğer (else if) önermesi
Diğer-eğer önermesi kontrol yapınıza başka ifadeler ekleminizi olanaklı kılar ve bu önerme istenildiği kadar eklenebilir. Unutmayın R ilk TRUE sonucunu yakaladığında diğer önermeleri test etmeyecektir. Yazımı aşağıdaki gibidir.
if (koşulumuz) {
çıktı1
} else if {
çıktı2
} else if {
çıktı3
} else {
çıktı4
}
if (takim =="genclerbirligi") {
print ("Kızıl-Kara-Burası-Ankara")
} else if (takim =="ankaragucu") {
print ("Ankara takımı")
} else {
print ("Başka takım")
}
## [1] "Kizil-Kara-Burasi-Ankara"
Aşağıdaki örnekte bu bölümde şu ana kadar öğrendiğimiz kodları bir arada bulabilirsiniz. Amacımızın bir “gollü maç katsayısı/gmk” yaratmak olduğunu varsayalım Öncelikle futbol takımlarımızın ilk hafta attığı golleri değişken olarak tanımlayalım.
gb <- 4
ag <- 5
Koşullarımızı ise şöyle tanımlayalım:
gb ve ag değişkenlerinin her ikisi de 3’nin üzerindeyse, gmk, gb ve ag değerlerinin toplamının iki katı olsun,
gb ve ag değişkenlerinin her ikisi de 2’nin altındaysa, gmk, gb ve ag değerlerinin toplamının yarısı olsun
diğer tüm koşullarda gmk, gb ve ag değerleri toplamı olsun,
sonucu konsolda görüntüleyelim
if (gb > 3 & ag > 3 ) {
gmk <- 2 * (gb + ag)
} else if (gb < 2 & ag < 2) {
gmk <- 0.5 * (gb + ag)
} else {
gmk <- gb+ag
}
gmk
## [1] 18