Geçen haftaki derste kontrol yapıları ve döngüler konusuna başlamıştık. if, else, ifelse, for gibi döngü yapılarını öğrendik. Döngülerin mantığını ve işlevini anlamanın kod yazabiliyorum diyebilmenin temelini oluşturduğunu anladım. Bu yapılar sayesinde daha az kod satırı yazarak birçok işlem yapılabiliyor ve bu da kodlamamızın performansını artırıyor.

next() ve break()

next ve break fonksiyonları aslında döngülerin kontrol mekanizmmalarıdır.

  • Döngüyü sadece belirli bir koşulda çalıştırmak istemediğimiz zaman next() fonksiyonunu kullanabiliriz.
for(i in 1:6){
  if(i==3){
next # 3 değerini atlayıp diğerlerini yazar
  }
  print (i)}
## [1] 1
## [1] 2
## [1] 4
## [1] 5
## [1] 6
  • Döngüyü sadece belirli bir koşulda durdurmak istediğimiz zaman break() fonksiyonunu kullanabiliriz.
for(i in 1:12){
  if(i==3){
break # 3 değerine gelince döngüyü durdurur
  }
  print (i)}
## [1] 1
## [1] 2

döngü ile ve döngüsüz işlemler-karşılaştırma

set.seed(853)
y<-matrix(rnorm(1000000),nrow=1000)
z<-0*y
  • işlemi döngü ile yapalım:
#loop:
time2 <- system.time(
  for(i in 1:1000){
  for(j in 1:1000){
z[i,j]<-y[i,j]^2
  }
})

time2
##    user  system elapsed 
##    0.05    0.00    0.05
  • işlemi döngüsüz yapalım:
time3 <- system.time(z<-y^2)
time3
##    user  system elapsed 
##       0       0       0

içiçe for döngüleri

İç içe döngüler genellikle çok boyutlu veya hiyerarşik veri yapıları (örn. matrisler, listeler) için gereklidir. Yine de iç içe geçme konusunda dikkatli olunmalıdır. 2-3 seviyeden fazla iç içe geçme genellikle kodun okunmasını/anlaşılmasını zorlaştırır. Çok sayıda iç içe döngüye ihtiyaç duyulursa, fonksiyonları kullanarak döngüleri parçalamak gerekebilir.

x <- matrix(1:6, 2, 3)

for(i in seq_len(nrow(x))) {
        for(j in seq_len(ncol(x))) {
                print(x[i, j])
        }   
}
## [1] 1
## [1] 3
## [1] 5
## [1] 2
## [1] 4
## [1] 6

Sıra sizde

m2 <- matrix(0,nrow=5,ncol=5)
m2
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    0    0    0    0    0
## [2,]    0    0    0    0    0
## [3,]    0    0    0    0    0
## [4,]    0    0    0    0    0
## [5,]    0    0    0    0    0

Yukarıdaki 5X5 boş bir matrisin her bir elemanı satır ve sütun indeksleri çarpımı olsun. Örneğin: 2. satır 5. sütun elemanı 2*5=10 olsun. Aşağıdaki çıktıyı elde edecek kodu yazalım:

  [,1] [,2] [,3] [,4] [,5]

[1,] 1 2 3 4 5 [2,] 2 4 6 8 10 [3,] 3 6 9 12 15 [4,] 4 8 12 16 20 [5,] 5 10 15 20 25

for (i in 1:5) {
  for (j in 1:5) {
    m2[i, j] <- i * j
  }
}

print(m2)
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    2    3    4    5
## [2,]    2    4    6    8   10
## [3,]    3    6    9   12   15
## [4,]    4    8   12   16   20
## [5,]    5   10   15   20   25

while döngüsü

While döngüleri bir koşulu test ederek başlar. Koşul doğruysa, döngü gövdesini çalıştırır. Döngü gövdesi yürütüldükten sonra, koşul tekrar test edilir ve koşul yanlış olana kadar bu şekilde devam eder, ardından döngüden çıkılır.

count <- 0
while(count < 10) {
        print(count)
        count <- count + 1
}
## [1] 0
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
## [1] 8
## [1] 9
z <- 5
set.seed(1)

while(z >= 3 && z <= 10) {
        coin <- rbinom(1, 1, 0.5)
        
        if(coin == 1) {  ## rastgele çalışır
                z <- z + 1
        } else {
                z <- z - 1
        } 
}
print(z)
## [1] 2

Ödevler

S1) Kullanıcı tarafından belirlenen nxn boyutunda bir matris oluşturulsun. nxn bir matrisin her bir elemanı satır ve sütun indeksleri çarpımı olsun. Örneğin: 2. satır 5. sütun elemanı 2*5=10 olsun

Eger matrisin boyutları 10x10’dan büyükse sadece 10 satırını yazsın eğer matrisin boyutları 10x10’dan küçükse hepsini yazsın.

Kullancı üç girdiğinde oluşacak çıktı:

  [,1] [,2] [,3]

[1,] 1 2 3 [2,] 2 4 6 [3,] 3 6 9

# Matris boyutunu belirle
n <- 10 

if (is.na(n) || n <= 0) {
  stop("Geçerli bir matris boyutu girin.")
}
if (n > 100) {
  stop("Matris boyutu çok büyük! 100x100 veya daha küçük bir boyut girin.")
}

# nxn matris oluştur
matris <- matrix(0, nrow = n, ncol = n)

for (i in 1:n) {
  for (j in 1:n) {
    matris[i, j] <- i * j
  }
}

if (n > 10) {
  print(matris[1:10, ])  # Sadece ilk 10 satırı yazdır
} else {
  print(matris)  # Tüm matrisi yazdır
}
##       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
##  [1,]    1    2    3    4    5    6    7    8    9    10
##  [2,]    2    4    6    8   10   12   14   16   18    20
##  [3,]    3    6    9   12   15   18   21   24   27    30
##  [4,]    4    8   12   16   20   24   28   32   36    40
##  [5,]    5   10   15   20   25   30   35   40   45    50
##  [6,]    6   12   18   24   30   36   42   48   54    60
##  [7,]    7   14   21   28   35   42   49   56   63    70
##  [8,]    8   16   24   32   40   48   56   64   72    80
##  [9,]    9   18   27   36   45   54   63   72   81    90
## [10,]   10   20   30   40   50   60   70   80   90   100

S2) Fibonacci dizisinin elemanlari 1 1 2 3 5 8 13 21 34 55 89 … dizinin elemanlarını for() ve/ve ya while() döngüsü ile oluşturmaya çalışınız.

  • for() döngüsü ile hesaplama:
n<-20
fibonacci<-numeric(n)
fibonacci[1]<-1
fibonacci[2]<-1
for(i in 3:n) {
  fibonacci[i]<-fibonacci[i-1]+fibonacci[i-2]
}
print(fibonacci)
##  [1]    1    1    2    3    5    8   13   21   34   55   89  144  233  377  610
## [16]  987 1597 2584 4181 6765
  • while() döngüsü ile hesaplama:
n1<-15
fibonacci1 <- c(1, 1)
i <- 3
while (i <= n1) {
  fibonacci1 <- c(fibonacci1, fibonacci1[i - 1] + fibonacci1[i - 2])
  i <- i + 1
}
print(fibonacci1)
##  [1]   1   1   2   3   5   8  13  21  34  55  89 144 233 377 610

S3) Aşağıda ornek veri setini oluşturma kodları yer almaktadır.

set.seed(1786)
ornek<-exp(matrix(rnorm(2000),nrow=100))
index1.temp<-sample(1:100,10)
index2.temp<-sample(1:20,10)

for(i in 1:10){
  ornek[index1.temp[i],index2.temp[i]]<--1
}
 head(ornek,6)
##           [,1]      [,2]      [,3]      [,4]      [,5]      [,6]     [,7]
## [1,] 0.5549525 0.3247338 0.5236032 0.3821027 0.4187483 0.1588847 5.226161
## [2,] 0.5671734 1.2431592 0.8812069 2.6695443 0.6984453 1.0838792 1.079946
## [3,] 4.8068457 0.3449856 0.6079096 0.9194116 1.5361330 1.9082522 0.671977
## [4,] 1.3509234 2.3569582 0.1931423 4.0707377 0.3527276 2.3498825 1.198514
## [5,] 0.9012032 0.2310683 0.2317487 1.3809955 0.9168741 0.6237213 1.609403
## [6,] 1.2331483 1.1066056 0.3546027 0.3705946 0.9002303 0.2528151 3.337512
##           [,8]      [,9]     [,10]     [,11]     [,12]     [,13]     [,14]
## [1,] 2.6280057 1.2251526 0.4760966 5.2379018 1.4782655 1.3761338 1.0202608
## [2,] 2.2087385 0.5195551 0.3757409 0.9004808 0.7409205 2.0543842 0.3668661
## [3,] 1.5310016 0.6735007 2.2069776 0.5060078 0.7171477 1.2378655 0.3651527
## [4,] 2.5592899 1.8205257 1.2624052 0.1524106 0.3828322 1.2406799 0.7954326
## [5,] 1.1005990 1.0619758 2.1047783 2.7816902 1.4010878 0.6140937 0.5136842
## [6,] 0.9799103 2.7520425 2.5407624 1.3889136 0.4346808 1.0637950 0.1859157
##          [,15]     [,16]      [,17]     [,18]    [,19]     [,20]
## [1,] 0.1437680 4.1807643  1.7389423 3.0760640 1.550557 4.4838291
## [2,] 3.8674407 1.9349214  0.6333922 0.4862532 5.275571 0.1161029
## [3,] 1.4724240 0.5971116 11.5869157 0.7580736 4.755297 1.0583051
## [4,] 0.1243085 0.8376231  1.3723291 2.0884571 2.506128 1.2094517
## [5,] 6.2971803 0.8422164  1.5335222 0.3079718 2.729447 1.7164885
## [6,] 3.8052219 2.1611055  0.3280288 2.7773368 1.726558 1.3193446
  • Örnek veri setinde i. satırda negatif sayı yok ise çıktıda i. satırın ortalaması….dir yazsin.

  • Eğer veri setinde her hangi bir satırda negatif sayı var ise satır i negatif sayı bulunmaktadır.

  • Veri setindeki satırlardaki toplam negatif sayı toplamı üçü geçerse çktıda cok sayıda negatif sayı yazsın ve döngü çalışmayı durdursun.

negatif<-0
for(i in 1:nrow(ornek)) {
  if(any(ornek[i, ]<0)) {
    negatif<-sum(ornek[i, ]<0)
    cat("Satir", i, "negatif sayı içermektedir.\n")
  } else{
    cat("Satir", i, "ortalaması", mean(ornek[i, ]),"dir.\n")
  }
  if(negatif>3){
    cat("Çok sayıda negatif sayı!\n")
    break
  }
}
## Satir 1 ortalaması 1.810246 dir.
## Satir 2 ortalaması 1.385186 dir.
## Satir 3 ortalaması 1.913065 dir.
## Satir 4 ortalaması 1.411238 dir.
## Satir 5 ortalaması 1.444987 dir.
## Satir 6 ortalaması 1.450956 dir.
## Satir 7 ortalaması 1.283952 dir.
## Satir 8 ortalaması 1.092563 dir.
## Satir 9 ortalaması 1.423682 dir.
## Satir 10 negatif sayı içermektedir.
## Satir 11 ortalaması 1.638674 dir.
## Satir 12 negatif sayı içermektedir.
## Satir 13 ortalaması 1.470122 dir.
## Satir 14 ortalaması 1.68761 dir.
## Satir 15 ortalaması 1.515547 dir.
## Satir 16 ortalaması 1.995183 dir.
## Satir 17 ortalaması 1.479423 dir.
## Satir 18 ortalaması 1.444495 dir.
## Satir 19 ortalaması 1.543788 dir.
## Satir 20 ortalaması 2.179839 dir.
## Satir 21 ortalaması 1.48708 dir.
## Satir 22 ortalaması 2.109184 dir.
## Satir 23 ortalaması 2.537019 dir.
## Satir 24 negatif sayı içermektedir.
## Satir 25 negatif sayı içermektedir.
## Satir 26 ortalaması 0.9815739 dir.
## Satir 27 ortalaması 2.101201 dir.
## Satir 28 ortalaması 1.587085 dir.
## Satir 29 ortalaması 2.079341 dir.
## Satir 30 ortalaması 1.628384 dir.
## Satir 31 ortalaması 1.062133 dir.
## Satir 32 ortalaması 1.301769 dir.
## Satir 33 ortalaması 1.227166 dir.
## Satir 34 ortalaması 1.680898 dir.
## Satir 35 ortalaması 2.04331 dir.
## Satir 36 ortalaması 1.620427 dir.
## Satir 37 ortalaması 1.495115 dir.
## Satir 38 negatif sayı içermektedir.
## Satir 39 ortalaması 1.649573 dir.
## Satir 40 negatif sayı içermektedir.
## Satir 41 ortalaması 1.610874 dir.
## Satir 42 ortalaması 2.512928 dir.
## Satir 43 ortalaması 1.292538 dir.
## Satir 44 ortalaması 0.9953383 dir.
## Satir 45 ortalaması 1.063196 dir.
## Satir 46 ortalaması 2.08723 dir.
## Satir 47 ortalaması 1.638381 dir.
## Satir 48 ortalaması 1.587481 dir.
## Satir 49 ortalaması 1.360392 dir.
## Satir 50 ortalaması 2.503081 dir.
## Satir 51 negatif sayı içermektedir.
## Satir 52 ortalaması 1.170185 dir.
## Satir 53 ortalaması 1.399327 dir.
## Satir 54 ortalaması 0.8518139 dir.
## Satir 55 ortalaması 1.388742 dir.
## Satir 56 ortalaması 1.288191 dir.
## Satir 57 ortalaması 2.405831 dir.
## Satir 58 ortalaması 0.9549096 dir.
## Satir 59 ortalaması 1.372126 dir.
## Satir 60 ortalaması 1.382571 dir.
## Satir 61 ortalaması 1.133602 dir.
## Satir 62 ortalaması 0.7106791 dir.
## Satir 63 ortalaması 1.018546 dir.
## Satir 64 negatif sayı içermektedir.
## Satir 65 ortalaması 1.159658 dir.
## Satir 66 ortalaması 0.8425556 dir.
## Satir 67 ortalaması 1.350846 dir.
## Satir 68 ortalaması 1.14464 dir.
## Satir 69 ortalaması 1.315107 dir.
## Satir 70 ortalaması 1.602467 dir.
## Satir 71 ortalaması 1.9137 dir.
## Satir 72 ortalaması 2.177261 dir.
## Satir 73 ortalaması 1.150917 dir.
## Satir 74 ortalaması 3.378813 dir.
## Satir 75 ortalaması 1.445871 dir.
## Satir 76 ortalaması 1.65785 dir.
## Satir 77 ortalaması 1.11154 dir.
## Satir 78 ortalaması 1.663698 dir.
## Satir 79 ortalaması 1.372642 dir.
## Satir 80 ortalaması 1.455401 dir.
## Satir 81 ortalaması 1.154774 dir.
## Satir 82 ortalaması 3.348687 dir.
## Satir 83 ortalaması 2.635185 dir.
## Satir 84 ortalaması 1.3548 dir.
## Satir 85 ortalaması 1.95681 dir.
## Satir 86 negatif sayı içermektedir.
## Satir 87 ortalaması 1.450208 dir.
## Satir 88 ortalaması 1.150915 dir.
## Satir 89 ortalaması 1.255246 dir.
## Satir 90 ortalaması 0.763787 dir.
## Satir 91 ortalaması 1.2954 dir.
## Satir 92 negatif sayı içermektedir.
## Satir 93 ortalaması 1.23735 dir.
## Satir 94 ortalaması 2.151894 dir.
## Satir 95 ortalaması 1.48521 dir.
## Satir 96 ortalaması 1.569037 dir.
## Satir 97 ortalaması 1.749064 dir.
## Satir 98 ortalaması 2.91383 dir.
## Satir 99 ortalaması 1.324444 dir.
## Satir 100 ortalaması 1.720395 dir.

S4) Aşağıdaki geometrik şekilleri farklı kodlamalar ile oluşturunuz.

  • içi dolu kare:
n<-5
for(i in 1:n){
  for(j in 1:n){
    cat("* ")
  }
  cat("\n")
}
## * * * * * 
## * * * * * 
## * * * * * 
## * * * * * 
## * * * * *
  • içi boş kare:
n<-5
for(i in 1:n){
  for(j in 1:n){
    if(i==1||i==n||j==1||j==n){
      cat("* ")
    }else{
     cat("  ")
    }
  }
  cat("\n")
}
## * * * * * 
## *       * 
## *       * 
## *       * 
## * * * * *
  • dolu üçgen:
for(i in 1:5){
  cat(rep("*",i),"\n")
}
## * 
## * * 
## * * * 
## * * * * 
## * * * * *
  • eşkenar üçgen:
for (i in 1:10) {
  cat(rep(" ", 10 - i), rep("*", 2 * i - 1), "\n", sep = "")
}
##          *
##         ***
##        *****
##       *******
##      *********
##     ***********
##    *************
##   ***************
##  *****************
## *******************
  • içi boş eşkenar üçgen:
for(i in 1:10){
  if(i==1){
    cat(rep(" ",9),"*","\n", sep="")
  } else if(i==10){
    cat(rep("*",19),"\n", sep="")
  } else{
    cat(rep(" ",10-i),"*", rep(" ", 2*i-3),"*","\n",sep="")
  }
}
##          *
##         * *
##        *   *
##       *     *
##      *       *
##     *         *
##    *           *
##   *             *
##  *               *
## *******************
  • dik üçgen:
for(i in 1:5){
  cat(rep(" ",5-i), rep("*",i),"\n", sep="")
}
##     *
##    **
##   ***
##  ****
## *****
  • diyagonal Çizgi:
for(i in 1:5){
  cat(rep(" ", i-1),"*", "\n", sep="")
}
## *
##  *
##   *
##    *
##     *

NOT: Kontrol yapıları ve dööngülerde hala zorlanıyorum, bu ara fazla tekrar yapamamamdan kaynaklanıyor sanırım. Ama kodlları yazarken döngüleri bölerek yazınca daha kolay yazabildiğimi anladım. Soru 4’teki şekilleri oluştururken chatcpt’den yardım aldım, kendim yapamadım.