Bölüm4 Döngüler (Loops)

Döngüler (Loops) tekrar eden kodlama işlerini kolaylaştırmak için kullanılır. Tekrar eden koşullu önermeler olarak da nitelendirilebilecek olan döngü kodları, tüm kod parçalarını belirli bir kural döngüsü içinde tekrarlamak için kullanılır.

4.1 While Döngüsü (while loop)

While loop tüm kod parçalarını belirli bir kural döngüsü içinde tekrarlamak için kullanılır. Unutulmaması gereken nokta, while loop kullanıldığında kodun bir noktada FALSE sonucunu üretme zorunluluğudur. Eğer bu şart yerine getirilmezse kod sonsuza kadar tekrar etmeye devam eder.

While loop yazımı if koşul yazımına çok benzer ve aşağıdaki gibidir

while (koşulumuz) {
  çıktı1
}

Bir araba yarışında yardımcı pilotluk yaptığınızı ve parkurun özelliklerine göre pilota yardım etmekle görevli olduğunuz bir durumu düşünelim. Arabanızın hızını ölçen bilgisayarınızı yanınıza aldınız ve programlamaya başladınız. Hızın 100’den fazla olduğu durumlarda pilotunuzu hızı 100’e kadar düşürmesi konusunda uyarmanız lazım. Bunun için ilk başta arabamızın anlık hızını bilmemiz gerekiyor, varsayalım ki bu da 120 olsun. Arabamızın da saniye de 10 km hız düşürme yeteneği oolduğunu da biliyoruz. ilgili while loop kodunu aşağıda bulabilirsiniz.

hiz <- 170

while (hiz > 100 ) {
  print("yavaşla")
  hiz <- hiz - 10
}
## [1] "yavasla"
## [1] "yavasla"
## [1] "yavasla"
## [1] "yavasla"
## [1] "yavasla"
## [1] "yavasla"
## [1] "yavasla"
hiz
## [1] 100

Görüldüğü üzere 140 km hızdan 10 km lik aralıklar ile 7 kez tekrar ederek sürücümüzü 100 km ye indirmeyi başardık.

Şimdi araya bazı koşullar daha ekleyelim. Varsayalım ki arabamızın 150 km’den hızlı gitmemesi lazım. While loop döngüsü içinde if koşulları da kullanılabildiğinden bu koşulu yukarıdaki döngümüze ekleyebiliriz.

hiz <- 170

while (hiz > 100) {
  print(paste("Şu andaki hızın",hiz))
  if (hiz > 150) {
    print("çok çabuk yavaşlaman lazım!")
    hiz <- hiz - 20
  } else {
    print("Yavaşla")
    hiz <- hiz - 10
  }
}
## [1] "Su andaki hizin 170"
## [1] "çok çabuk yavaslaman lazim!"
## [1] "Su andaki hizin 150"
## [1] "Yavasla"
## [1] "Su andaki hizin 140"
## [1] "Yavasla"
## [1] "Su andaki hizin 130"
## [1] "Yavasla"
## [1] "Su andaki hizin 120"
## [1] "Yavasla"
## [1] "Su andaki hizin 110"
## [1] "Yavasla"
hiz
## [1] 100

10’dan küçük sayıları üçer üçer arttırdığımızda ilk olarak 8’e bölünebilen sayı hangisidir? Bu soruyu da bilgisayarımıza loop tanımlayarak çözebiliriz. Sayımızı 1 den başlatalım ve “i” değişkeni olarak tanılayalım.

i <- 1

while (i <= 10) {
  print(3*i)
  if ((3*i) %% 8 == 0 ) {
    break
  }
  i <- i + 1
}
## [1] 3
## [1] 6
## [1] 9
## [1] 12
## [1] 15
## [1] 18
## [1] 21
## [1] 24

Koddan da anlaşılacağı üzere bilgisayar 10 dan küçük sayıları birer birer arttırdı, üçle çarptı ve ilk olarak 8’e bölünebilen 24 sayısını hesapladığında break komutu ile işlemi durdurdu.

4.2 For Döngüsü (for loop)

For döngüsü while loop döngüsünden bir dizi değişken üzerinde aynı anda işlem yapması açısından farklılaşır. Lütfen aşağıdaki temel for loop kodunu inceleyin.

for (dizideki her bir değişken için){
  çıktı
}

Aşağıdaki örnekte Ankara’nın semtlerinin bulunduğu bir vektör üzerinde for loop kodunu deneyelim.

semtler <- c("Yeni Doğan", "Solfasol", "çankaya", "Dikmen", "Esat", "Cebeci")

Bu vektörü yazdırdığımızda semtlerin bir listesini alırız. Fakat varsayalım ki bu vektördeki her semt için başka bir özellik tanımlamak istiyoruz. Aşağıdaki örnekte for loop bu iş için kullanılmaktadır.

for(semt in semtler){
  print(semt)
}

R yukarıdaki kodu şöyle algılar:

  1. Semtler vektöründeki her bir değişkeni ayrı bir semt olarak tanımlayacağım.

  2. Semtler vektöründeki ilk değişkeni ayrı bir semt değişkeni olarak kaydedeceğim.

  3. ikinci aşamadaki kaydettiğim semt değişkenini yazacağım.

  4. Bu işlemi “semtler” vektöründeki altı semt için ayrı ayrı tekrarlayacağım.

for(semt in semtler){
  print(semt)
}
## [1] "Yeni Dogan"
## [1] "Solfasol"
## [1] "çankaya"
## [1] "Dikmen"
## [1] "Esat"
## [1] "Cebeci"

for loop listeler, veritabanları ve üzerinde de aynı şekilde kullanılabilir.

for looplar için breakkomutunun kullanımı gayet önemlidir. breakkomutu kontrollerin ilk TRUE sonucu verdiği noktada kodun durması için kullanılır. Örneğin yukarıdaki semtlerde 7 harfli ilk semt bulunduğunda kodun durmasını istediğimizde aşağıdaki kodu aşağıdaki gibi yazmamız gerekir.

for (semt in semtler) {
  if (nchar(semt) == 7) {
    break
  }
print(semt)  
}
## [1] "Yeni Dogan"
## [1] "Solfasol"

Yukarıdaki kodda nchar karakter sayısını kontrol eden bir fonksiyondur. R ilk başta “Yeni Doğan” değişkenindeki karakterleri sayar. Bu sayım yediden fazla olduğundan kontrol devam eder, yedi karakterli “çankaya” bulunduğunda işlem break argümanından dolayı sona erer.

next argümanı da benzer şekilde kullanılır ama ürettiği sonuç farklıdır. Yukarıdaki kodda bulunan break argümanını next argümanı ile değiştirip kodu tekrar çalıştırıp sonucunu kontrol edelim.

for (semt in semtler) {
  if (nchar(semt) == 7) {
    next
  }
print(semt)  
}
## [1] "Yeni Dogan"
## [1] "Solfasol"
## [1] "Dikmen"
## [1] "Esat"
## [1] "Cebeci"

nextargümanı koşulu sağlayan “çankaya” değişkenini atlayıp diğer değişkenlerin raporlanmasını sağladı.

4.3 for loop: v2

for loopun işleri kolaylaştıran başka türlü bir kullanımı daha bulunuyor. Yukarıdaki örnekte sadece semtin ismi raporlanmıştı. Semt isminin yanı sıra bu semtin vektör içerisindeki yerini de raporlamak istediğimizi varsayalım. Bunun için R’ın semtler üzerindeki otomatik yaptığı tekrar yerine, kendimiz bir döngü indeksi yaratmamız gerekir. Aşağıdaki kodda 1 ile başlayıp semtler vektörünün uzunluğu kadar (6) birer birer artan bir “i” değeri tanımlanmaktadır. Böylece vektöre erişim sağlanıp farklı özellikler de raporlanabilir.

for (i in 1:6) {
  print(paste(semtler[i], "bu vektörde", i, "numaradır"))
}
## [1] "Yeni Dogan bu vektörde 1 numaradir"
## [1] "Solfasol bu vektörde 2 numaradir"
## [1] "çankaya bu vektörde 3 numaradir"
## [1] "Dikmen bu vektörde 4 numaradir"
## [1] "Esat bu vektörde 5 numaradir"
## [1] "Cebeci bu vektörde 6 numaradir"

loop lar ile if gibi kontrol argümanları beraber kullanılabilir. Gençlerbirliği gol sayıları üzerinde bir deneme yapalım. Kodumuz Gençlerbirliği’nin birden fazla gol attığı haftalarda “Gelsin goller” diğer durumlarda ise “Daha fazla gol lazım!” sonucunu üretsin

for (gol in genclerbirligi) {
  if (gol > 2) {
    print("Gelsin goller!")
  } else {
    print("Daha fazla gol lazım")
  }
  print(gol)
}
## [1] "Gelsin goller!"
## [1] 4
## [1] "Gelsin goller!"
## [1] 3
## [1] "Daha fazla gol lazim"
## [1] 0
## [1] "Daha fazla gol lazim"
## [1] 2
## [1] "Daha fazla gol lazim"
## [1] 0
## [1] "Gelsin goller!"
## [1] 5
## [1] "Daha fazla gol lazim"
## [1] 1