4  Kontrol İfadeleri

Kontrol ifadeleri ve döngüler R içerisinde sıklıkla kullanılan yapılardır. Belirli şartlara bağlı olan ya da tekrarlı işlemler için oldukça faydalıdırlar. R programlama dilinde en çok kullanılan if-else, for, while, next, break gibi kontrol döngüleridir.

4.1 if-else

if-else ifadesi, programların belirli koşullar altında farklı işlemler yapmasını sağlar. Eğer bir koşul doğruysa belirli bir blok çalıştırılır, aksi takdirde başka bir blok çalıştırılır. Bu kombinasyon R’de en sık kullanılan kontrol yapılarındandır. Bu yapıda, bir koşulu test edebilir ve doğru veya yanlış olmasına bağlı olarak ona göre hareket edebilirsiniz. if-else kombinasyonlarında aşağıdaki yapılar kullanılmaktadır:

if (koşul) {
  # Koşul doğruysa yapılacak işlemler
} else {
  # Koşul yanlışsa yapılacak işlemler
}
if (koşul1) {
  # Koşul 1 doğruysa yapılacak işlemler
} else if (koşul2) {
  # Koşul 2 doğruysa yapılacak işlemler
} else {
  # Hiçbir koşul doğru değilse yapılacak işlemler
}

Örnek olarak, bir kullanıcının yaşına bağlı olarak belli bir mesaj gösterelim.

yas <- 18

if (yas >= 18) {
  print("Oy kullanabilirsiniz!")
} else {
  print("Üzgünüz, oy kullanmak için henüz yaşınız tutmuyor.")
}
[1] "Oy kullanabilirsiniz!"

Burada, if ifadesi yas >= 18 koşulunu kontrol eder. Eğer bu koşul doğruysa, “Oy kullanabilirsiniz!” mesajı ekrana yazdırılır; aksi halde, “Üzgünüz, oy kullanmak için henüz yaşınız tutmuyor.” mesajı yazdırılır.

Birden fazla koşulu kontrol etmek için else if ifadesini kullanabiliriz. Örneğin, bir öğrencinin not durumunu kontrol edelim.

not <- 75

if (not >= 90) {
  print("Notunuz AA")
} else if (not >= 80) {
  print("Notunuz BA")
} else if (not >= 70) {
  print("Notunuz BB")
} else if (not >= 60) {
  print("Notunuz CB")
} else {
  print("Dersten başarısız oldunuz.")
}
[1] "Notunuz BB"

Bu örnekte, else if ifadeleri sırayla öğrencinin notunu kontrol eder ve koşullara uygun olarak farklı mesajları yazdırır. Eğer hiçbir koşul sağlanmazsa, “Dersten başarısız oldunuz.” mesajı yazdırılır.

Ayrıca ifelse() fonksiyonu R programlama dilinde bulunan başka bir fonksiyondur ve if-else ifadesine benzer bir işlevi vardır. Bu fonksiyon, vektörler üzerinde koşullu işlemler yapmak için kullanılır.

ifelse() fonksiyonu şu şekilde kullanılır.

ifelse(test, yes, no)
  • test: Koşul veya koşulları içeren ifade veya vektör.

  • yes: Koşul doğruysa uygulanacak değer veya işlem.

  • no: Koşul yanlışsa uygulanacak değer veya işlem.

Örnek olarak, bir vektördeki değerlerin pozitif veya negatif olmasını kontrol edelim:

vec <- c(-2, 3, -5, 8, -1)
sonuc <- ifelse(vec >= 0, "Pozitif", "Negatif")
print(sonuc)
[1] "Negatif" "Pozitif" "Negatif" "Pozitif" "Negatif"

Bu örnekte, ifelse() fonksiyonu vec vektöründeki her bir değeri kontrol eder. Eğer değer 0’dan büyük veya eşitse, o değerin karşılığı “Pozitif” olur; aksi takdirde “Negatif” olur.

Aşağıdaki örnekte ise ifelse() fonksiyonun birden fazla şekilde bir dataframe içerisinde nasıl kullanıldığını gösterelim.

df <- data.frame(value = 1:9)
df$group <- ifelse(df$value <= 3,1,ifelse(df$value > 3 & df$value < 6,2,3))
df
  value group
1     1     1
2     2     1
3     3     1
4     4     2
5     5     2
6     6     3
7     7     3
8     8     3
9     9     3

Bu örnekte, yeni oluşturulacak group değişkeni için değerler atanacaktır. Buna göre,

  • Eğer value kolonu 3 ve altında değere sahipse group değişkenine 1,

  • value kolonu 3’den büyük ve 6’dan küçük ise group değişkenine 2,

  • Diğer durumlarda ise group değişkenine 3 değeri atanacaktır.

4.2 Döngüler

4.2.1 for

for döngüsü R programlama dilinde tekrarlı işlemler yapmak için kullanılır. Bu döngü, bir dizi veya vektör üzerinde iterasyon yaparak her bir elemana erişmenizi sağlar. Genellikle listedeki her elemanı veya belirli bir aralıktaki sayıları işlemek için kullanılır. for döngüsü şu yapıya sahiptir:

for (degisken in dizi veya dizin) {
  # Her iterasyonda yapılacak işlemler
}
  • degisken: Her iterasyonda dizin veya dizi elemanlarını temsil eden değişken.

  • dizi veya dizin: Döngünün üzerinde dolaşacağı vektör, liste veya sayı dizisi.

Örnek olarak, 1’den 5’e kadar olan sayıları ekrana yazdıran bir for döngüsü kullanalım:

sehirler <- c("İstanbul", "Ankara", "İzmir", "Bursa")

for (sehir in sehirler) {
  print(paste("Şehir:", sehir))
}
[1] "Şehir: İstanbul"
[1] "Şehir: Ankara"
[1] "Şehir: İzmir"
[1] "Şehir: Bursa"

Bu örnekte, sehirler listesindeki her bir elemanı sehir değişkenine atar ve bu elemanları döngü içinde kullanarak her bir şehri ekrana yazdırır.

for (i in 1:5) {
  print(paste("Karesi:", i^2))
}
[1] "Karesi: 1"
[1] "Karesi: 4"
[1] "Karesi: 9"
[1] "Karesi: 16"
[1] "Karesi: 25"

Bu örnek, 1’den 5’e kadar olan sayıları i değişkenine atar ve her bir sayının karesini ekrana yazdırır.

for (i in 1:5) {
  for (j in 1:5) {
    cat(i, "*", j, "=", i*j, "\t")
  }
  cat("\n")
}
1 * 1 = 1   1 * 2 = 2   1 * 3 = 3   1 * 4 = 4   1 * 5 = 5   
2 * 1 = 2   2 * 2 = 4   2 * 3 = 6   2 * 4 = 8   2 * 5 = 10  
3 * 1 = 3   3 * 2 = 6   3 * 3 = 9   3 * 4 = 12  3 * 5 = 15  
4 * 1 = 4   4 * 2 = 8   4 * 3 = 12  4 * 4 = 16  4 * 5 = 20  
5 * 1 = 5   5 * 2 = 10  5 * 3 = 15  5 * 4 = 20  5 * 5 = 25  

Bu örnekte, iç içe for döngüleri kullanılarak 1’den 5’e kadar olan sayıların çarpım tablosu oluşturuluyor. cat fonksiyonu kullanılarak değerler ekrana yazdırılıyor ve \t ifadesi her bir değer arasında bir sekme boşluğu eklenmesini sağlıyor. Bu sayede çarpım tablosu satır içinde düzenli bir şekilde görüntülenmiş oluyor. \t kullanımı, metin tabanlı çıktıları düzenlemek ve okunabilirliği artırmak için yaygın olarak kullanılan bir yöntemdir.

n <- 10
fib <- numeric(n)
fib[1] <- 0
fib[2] <- 1

for (i in 3:n) {
  fib[i] <- fib[i-1] + fib[i-2]
}
print(fib)
 [1]  0  1  1  2  3  5  8 13 21 34

Bu örnekte, for döngüsü kullanılarak Fibonacci serisi hesaplanıyor ve n değerine göre seriyi ekrana yazdırıyor. Fibonacci serisi, her sayının kendisinden önceki iki sayının toplamıyla elde edildiği bir sayı dizisidir. Seri, herhangi bir rakam ile başlayabilir. Genellikle 0 ile başlar ve ilk iki terim 0 ve 1’dir.

Seri şu şekilde ilerler:

0, 1, 1, 2, 3, 5, 8, 13, 21, …

Her sayı, kendisinden önce gelen iki sayının toplamıdır. Örneğin, 2 sayısı 1 ve 1’in toplamıdır, 3 sayısı ise 1 ve 2’nin toplamıdır ve bu şekilde devam eder.

Fibonacci Dizisinde yer alan sayıların diğer bir özelliği kendilerinden bir öncekiyle oranlandığında oluşan serinin altın orana yaklaşarak ilerlemesidir. Fibonacci serisi, doğada birçok yerde gözlemlenen yapılarla ilişkilendirilir. Bitki yapısı, deniz kabukları, sanat eserleri ve matematiksel modellemelerde sıkça karşımıza çıkar. Ayrıca, algoritmaların ve programların verimliliğini test etmek için kullanılabilir.

for döngüsünde i, j gibi harfler yerine başka ifadeler de kullanılabilir. Aşağıdaki örnekte oluşturulan 3 değişkenli bir veri setindeki ortalama değerler var değişkeni kulanılarak döngü yardımıyla ekrana yazdırılmıştır.

(x <- data.frame(yas = c(28, 35, 13, 13),
                boy = c(1.62, 1.53, 1.83, 1.71),
                kilo = c(65, 59, 72, 83)))
  yas  boy kilo
1  28 1.62   65
2  35 1.53   59
3  13 1.83   72
4  13 1.71   83
for (var in colnames(x)) {
    m <- mean(x[, var])
    print(paste0("Ortalama ", var," ", m, "'tir"))
}
[1] "Ortalama yas 22.25'tir"
[1] "Ortalama boy 1.6725'tir"
[1] "Ortalama kilo 69.75'tir"

Kullanım Alanları

  • Veri İşleme: Veri setlerindeki her bir öğeyi işlemek için for döngüsü kullanılabilir. Örneğin, liste, vektör veya matrislerdeki her bir öğeyi ele almak için kullanılabilir.

  • Tekrarlı İşlemler: Belirli bir işlemi veya kod bloğunu belirli bir sayıda veya belirli bir koşula kadar tekrar etmek için for döngüsü kullanılabilir.

  • İterasyonlar ve Simülasyonlar: İterasyonlar, özellikle simülasyonlarda, çeşitli durumları veya senaryoları değerlendirmek için sıklıkla kullanılır. Her bir iterasyon, farklı bir durumu temsil edebilir.

Uyarı

for döngüsü, belirli bir veri yapısındaki elemanları işlemek veya belirli bir işlemi tekrarlamak için oldukça kullanışlıdır. Ancak büyük veri setleri veya karmaşık işlemler için vektör işlemleri veya fonksiyonel programlama teknikleri genellikle tercih edilir, çünkü bu teknikler genellikle daha hızlı çalışabilir.

4.2.2 while

while döngüsü, belirli bir koşul doğru olduğu sürece belirli bir işlemi tekrar etmek için kullanılır. Genellikle döngünün kaç kere çalışacağı önceden belirlenmiş değilse veya bir koşul karşılanana kadar çalışmaya devam etmesi gerektiğinde tercih edilir. while döngüsü şu şekilde çalışır:

while (koşul) {
  # Koşul doğru olduğu sürece yapılacak işlemler
}

koşul: Bir mantıksal ifade veya değer. Bu koşul doğru olduğu sürece döngü çalışmaya devam eder.

toplam <- 0
i <- 1

while (i <= 10) {
  toplam <- toplam + i
  i <- i + 1
}

print(toplam)
[1] 55

Bu örnekte, while döngüsü kullanılarak 1’den 10’a kadar olan sayıların toplamı hesaplanıyor.

Kullanım Alanları

  • Kullanıcı Girişi: Kullanıcıdan bir değer alınana veya belirli bir koşul karşılanana kadar kullanıcıdan giriş almak için kullanılabilir.

  • Dosya Okuma ve Yazma İşlemleri: Dosya içeriği işlenirken belirli bir koşula kadar dosya okuma veya yazma işlemleri için kullanılabilir.

  • Doğrusal Arama: Bir koşul karşılanana kadar bir listede veya veri yapısında doğrusal arama yapmak için kullanılabilir.

Uyarı

while döngüsü, belirli bir koşul doğru olduğu sürece çalışır ve bu koşulun sonlanması veya değişmesiyle birlikte döngü sona erer. Ancak dikkatli kullanılmadığında sonsuz döngülere neden olabilir, bu yüzden döngüdeki koşulun belirli bir zamanda sonlanmasını sağlamak önemlidir.

4.2.3 repeat

repeat döngüsü, belirli bir koşul sağlanana kadar tekrarlı işlemler yapmak için kullanılır. while döngüsünden farklı olarak, repeat döngüsü bir koşulun doğru veya yanlış olmasına bakmadan işlem yapmaya devam eder. Döngü, içerideki kod çalıştırıldıktan sonra, elle kesilmediği sürece sonsuza kadar devam eder.

repeat döngüsünün yapısı şu şekildedir:

repeat {
  # Koşul kontrolü yapılmaksızın sürekli çalışacak işlemler
  # Eğer bir şart sağlanırsa döngüyü kırarak çıkılır (break)
}

Genellikle repeat döngüsü, koşulun döngü içinde daha sonra kontrol edilmesi gereken durumlarda veya kullanıcıdan belirli bir işaret alınana kadar çalışması gereken durumlarda kullanılır.

repeat {
  rastgele_sayi <- runif(1)  # 0 ile 1 arasında rastgele bir sayı üretir
  print(rastgele_sayi)
  if (rastgele_sayi > 0.9) {
    break
  }
}
[1] 0.543787
[1] 0.324433
[1] 0.5637773
[1] 0.7491012
[1] 0.1625035
[1] 0.5460025
[1] 0.6146379
[1] 0.8452702
[1] 0.1217738
[1] 0.6022902
[1] 0.4623328
[1] 0.01746738
[1] 0.9977307

Bu örnekte, repeat döngüsü 0 ile 1 arasında rastgele sayılar üretir ve bu sayılar 0.9’dan büyük olduğunda döngüyü sonlandırır.

x <- 0

repeat {
    if (x^2 > 20) break     # bu koşul sağlandığında döngüyü bitir
    print(x)               
    x <- x + 1              # x'i bir artır
}
[1] 0
[1] 1
[1] 2
[1] 3
[1] 4

Bu örnekte ise, repeat döngüsü 0 ile başlayan bir x sayısının karesinin 20’den büyük olması durumuna kadar x sayısını print eder. Eğer x’in karesi 20’den büyük ise döngüyü sonlandırır.

Kullanım Alanları

  • Belirli Bir Durum Gerçekleşene Kadar İşlem Yapma: Kullanıcıdan belirli bir girdi alınana veya belirli bir durum gerçekleşene kadar işlem yapmak için kullanılabilir.

  • Kontrolsüz İşlemler: Belirli bir durum gerçekleşene kadar döngünün devam etmesi gerektiği durumlarda kullanılabilir. Örneğin, rastgele sayılar üretilmesi gibi.

Uyarı

repeat döngüsü, belirli bir koşul doğru veya yanlış olmasına bakmadan işlem yapmaya devam eder. Ancak, döngü sonsuz olabilir, bu nedenle döngüyü belirli bir şart sağlandığında kırmak (break ifadesiyle) önemlidir.

4.2.4 next

next ifadesi, döngülerde bir iterasyonu atlamak ve döngüyü devam ettirmek için kullanılır. Genellikle belirli bir koşul karşılandığında o iterasyonun işlenmesini atlamak için kullanılır.

next ifadesinin kullanımı döngü içinde şu şekildedir:

for (i in 1:10) {
  if (i %% 2 == 0) {
    next  # Çift sayıları atla
  }
  print(i)
}
[1] 1
[1] 3
[1] 5
[1] 7
[1] 9

Bu örnekte, %% operatörü bir sayının diğerine bölümünden kalanı verir. Eğer bir sayı 2’ye bölündüğünde kalan 0 ise, o sayı çifttir. Yukarıdaki döngü, i çift sayı olduğunda next ifadesiyle o iterasyonu atlar ve döngüyü devam ettirir.

Kullanım Alanları

  • Belirli Koşullarda İşlemleri Atlamak: Döngü içinde belirli bir koşul sağlandığında o iterasyonu atlamak için kullanılabilir.

  • Veri Filtreleme: Veri içinde belirli koşullara uymayan öğeleri atlamak için kullanılabilir. Örneğin, bir liste içinde belirli tipte öğeleri filtrelemek için.

  • Döngü Performansını İyileştirme: Bazı durumlarda belirli koşulların sağlanması durumunda işlemleri atlayarak döngü performansını artırabilir.

Not

next ifadesi, döngüler içinde belirli koşullarda iterasyonları atlamak ve döngüyü devam ettirmek için kullanılır. Bu sayede istenmeyen durumları veya öğeleri döngü içinde işlem yapmadan geçebilirsiniz.