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:

  1. gb ve ag değişkenlerinin her ikisi de 3’nin üzerindeyse, gmk, gb ve ag değerlerinin toplamının iki katı olsun,

  2. 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

  3. diğer tüm koşullarda gmk, gb ve ag değerleri toplamı olsun,

  4. 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