X <- cbind(1:5, 21:25)
X
##      [,1] [,2]
## [1,]    1   21
## [2,]    2   22
## [3,]    3   23
## [4,]    4   24
## [5,]    5   25

for() komutu ile X matrisini kullanarak aşağıdaki çıktıyı elde etmek için gerekli kodu yazınız.

1 satirdaki degerlerin carpimi 21 olarak hesaplanmistir.
2 satirdaki degerlerin carpimi 44 olarak hesaplanmistir.
3 satirdaki degerlerin carpimi 69 olarak hesaplanmistir.
4 satirdaki degerlerin carpimi 96 olarak hesaplanmistir.
5 satirdaki degerlerin carpimi 125 olarak hesaplanmistir.

for(i in 1:nrow(X)){
  
  cat(i,".satirdaki degerlerin carpimi" ,X[i,1]*X[i,2], "olarak hesaplanmistir.\n", sep= " ")
}
## 1 .satirdaki degerlerin carpimi 21 olarak hesaplanmistir.
## 2 .satirdaki degerlerin carpimi 44 olarak hesaplanmistir.
## 3 .satirdaki degerlerin carpimi 69 olarak hesaplanmistir.
## 4 .satirdaki degerlerin carpimi 96 olarak hesaplanmistir.
## 5 .satirdaki degerlerin carpimi 125 olarak hesaplanmistir.

next() fonksiyonu

next() fonksiyonu döngü içinde kontrol sağlamak için kullanılmaktadır. Verilen koşula denk gelene kadar döngüye devam eder, koşula geldiğinde döngüyü durdurur.

set.seed(41)
sayilar <- sample (0:10, 30, replace=TRUE)
sayilar
##  [1]  7  2  4  7  9  5  5  1  1 10  5  1  4  5  0  3  0  3  1  3  5  1  1  3  3
## [26]  4  2  0  5 10

Sayilar vektörü ile her bir elemanın çarpmanın tersi olacak şekilde yazılması için kod yaz. Her 0’a geldiğinde atlasın ve döngü devam etsin.

Kod şu şekilde yazılabilir.

for(i in 1:length(sayilar)) { #length ile vektör uzunluğunu kastediyoruz
  if(sayilar[i]==0){
    next #bu fonk. ile if ile belirttiğimiz gibi 0 atlanarak döngüye devam edilecek
  }
  cat("1/", sayilar[i], "\n", sep="") 
}
## 1/7
## 1/2
## 1/4
## 1/7
## 1/9
## 1/5
## 1/5
## 1/1
## 1/1
## 1/10
## 1/5
## 1/1
## 1/4
## 1/5
## 1/3
## 1/3
## 1/1
## 1/3
## 1/5
## 1/1
## 1/1
## 1/3
## 1/3
## 1/4
## 1/2
## 1/5
## 1/10

ya da

set.seed(41)
sayilar <- sample(0:10,30,replace=TRUE)

for(i in sayilar){
  if(i==0){
next
  }
  cat("1/",i,sep="","\n")}
## 1/7
## 1/2
## 1/4
## 1/7
## 1/9
## 1/5
## 1/5
## 1/1
## 1/1
## 1/10
## 1/5
## 1/1
## 1/4
## 1/5
## 1/3
## 1/3
## 1/1
## 1/3
## 1/5
## 1/1
## 1/1
## 1/3
## 1/3
## 1/4
## 1/2
## 1/5
## 1/10

break() fonksiyonu

break() fonksiyonu döngü içinde kontrol sağlamak için kullanılmaktadır. DÖngüyü belirtilen koşula geldiğinde tamamen durdurmak için kullanılır.

set.seed(41)
sayilar1 <- sample (-5:5, 10, replace= TRUE)
sayilar1
##  [1]  2 -3 -1  2  4  0  0 -4 -4  5

sayilar1 vektöründe yer alan negatif sayıyı görene kadar döngüye devam edecek bir kod yazalım.

for (i in sayilar1) {
 print(i) #print burada iken -3e geldikten sonra negatifliğini kontrol ediyor.o yüzden 2 ve -3 görüldü.
  
   if(i < 0) {
    break
  }
# print (i) ---- eğer negatifi gördüğü anda döngünün durmasını istiyorsak print burada olmalı. bu durumda sadece 2 değeri verilecek. 
}
## [1] 2
## [1] -3

Not: Bir işlemi döngüsüz yapabiliryorsak döngüsüz yapmalıyız. Çok verinin olduğu setlerde bu döngüler uzun zamanlar alabiliyor.

örneğin:

set.seed(853)
y<-matrix(rnorm(1000000),nrow=1000)
z<-0*y
#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.09    0.00    0.11

döngü halinde bu işlem 8 saniyedeyken döngüsüz şu şekildedir:

time3 <- system.time(z<-y^2)
time3
##    user  system elapsed 
##    0.00    0.00    0.01

görüldüğü üzere 1 saniye bile sürmüyor.

İç 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. Mümkünüse iki düzeyden fazla olmaması önerilir. Sİstemsel değil hatalara denk gelme ihtimalinden dolayı.

x <- matrix(1:6, 2, 3)
x
##      [,1] [,2] [,3]
## [1,]    1    3    5
## [2,]    2    4    6
for(i in seq_len(nrow(x))) { #xin satırları boyunca gidecek ilk döngü
   for(j in seq_len(ncol(x))) {  #üstteki for dönügüsünü ilk satır için çalıştırıp sütun üzerinden gidicek.
                print(x[i, j])
        }   
}
## [1] 1
## [1] 3
## [1] 5
## [1] 2
## [1] 4
## [1] 6

örnek:

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
for(i in 1:nrow(m2)) {
  for (j in 1:ncol(m2)) {
    m2[i,j] <- i*j
  }
}
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() bir koşulu test ederek başlar. Koşul doğruysa, döngüyü çalıştırır. Sonra koşulu tekrar test eder ve yanlışlanana kadar sürer yaniistenen koşul sağlanana kadar döngü sürüyor.

Sayı 10’dan küçük olması koşulu ile bir döngü oluşturalım:

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

görüldüğü üzere 9 da dahil olmak üzere 10’a gelene kadar döngü çalışıyor. Burada dikkatli olmak gerekiyor çünkü while() fonksiyonu kullanımında sonsuz döngüler olabilir.while() da birden fazla koşul olabilir.

Örneğin:

z <- 5
set.seed(1)

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

repeat() döngüsü

repeat() başlangıçtan itibaren sonsuz bir döngü başlatır. Durması için bizim durduracak bir kod yazmamız lazım yani çözüme ulaştığında duracak bir kod (IRT’de en küçük hata elde edildiğinde gibi)

x0 <- 1
tol <- 1e-8

repeat {
        x1 <- computeEstimate() #böyle bir fonksiyon yok. örnek amaçlı yazılmıştır 
        
        if(abs(x1 - x0) < tol) {  ## Yeterince yakın mı?
                break
        } else {
                x0 <- x1
        } 
}

if, while, for gibi tüm bu fonksiyonlar akış kontrolü sağlayan komutlardır.

ÖDEV

S1. nxn bir matrisin her bir elemanı satır ve sütun indeksleri çarpımı olsun.

soru1 <- matrix(nrow= 3, ncol= 3, 0)

for(i in 1: nrow(soru1)) {
  for(j in 1: ncol(soru1)){
    
    soru1[i,j] <- i*j
}}

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

S2.Fibonacci dizisinin elemanlarını for() ve/ve ya while() döngüsü ile oluşturmaya çalışınız.

S3.

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

3.1. ornek veri setinde i. satırda negatif sayı yok ise çıktıda i. satırın ortalaması….dir yazsin.

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

3.2. Eğer veri setinde herhangi bir satırda negatif sayı var ise satır i negatif sayı bulunmaktadır.

for(i in 1:nrow(ornek)) {
  if(any(ornek[i,] < 0)) #any kısmını chatgptden öğrendim. 
    cat("satır",i,"negatif sayı bulunmaktadır.\n")
}
## satır 10 negatif sayı bulunmaktadır.
## satır 12 negatif sayı bulunmaktadır.
## satır 24 negatif sayı bulunmaktadır.
## satır 25 negatif sayı bulunmaktadır.
## satır 38 negatif sayı bulunmaktadır.
## satır 40 negatif sayı bulunmaktadır.
## satır 51 negatif sayı bulunmaktadır.
## satır 64 negatif sayı bulunmaktadır.
## satır 86 negatif sayı bulunmaktadır.
## satır 92 negatif sayı bulunmaktadır.

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

S4.geometrik şekilleri farklı kodlamalar ile oluşturunuz

içi dolu kare

kare <- matrix(nrow= 5, ncol= 5, 0)
for(i in 1:nrow(kare)) {
  for(j in 1:ncol(kare)) {
    
        cat("*")
  }
  
  cat("\n")
  
  }
## *****
## *****
## *****
## *****
## *****

FONKSİYONLAR

f <- function() {
        ## Bu boş bir fonksiyondur
}
## Fonksiyonların kendi sınıfları vardır
class(f)  
## [1] "function"
## Bu işlevi çalıştırın
f()       
## NULL
f <- function() {
        cat("Merhaba!\n")
}
f()
## Merhaba!

Üç kez yazdırmak için:

f <- function(num) {
        for(i in seq_len(num)) {
                cat("Merhaba!\n")
        }
}
f(3)
## Merhaba!
## Merhaba!
## Merhaba!

3 kere merhaba yazıldı ve ek olarak toplamda 24 karakter yazdı fonksiyon:

f <- function(tekrar) {
        Merhaba <- "Merhaba!"
        for(i in seq_len(tekrar)) {
                cat(Merhaba, "\n")
        }
        chars <- nchar(Merhaba) * tekrar
        chars
        return(list(c1= Merhaba, c2= chars))
}
fonk_ciktisi <- f(3)
## Merhaba! 
## Merhaba! 
## Merhaba!
fonk_ciktisi$c1
## [1] "Merhaba!"
#?itemAnalysis()

 x<-data.frame(matrix(c(0,0,0,0,0,
                        0,0,0,0,0,
                        0,0,0,0,1,
                        0,0,0,1,1,
                        0,0,1,1,1,
                        0,1,1,1,1,
                        1,1,1,1,1,
                        1,0,1,1,1,
                        0,0,0,1,1,
                        0,1,1,1,1),nrow=10,ncol=5,byrow=TRUE,
                        dimnames=list(c(paste("P",c(1:10),sep="")),c(paste("I",c(1:5),sep="")))))
itemAnalysis(x)

# To see an item report with flags.
iA <- itemAnalysis(x, hardFlag=.25, pBisFlag=.15)
iA$itemReport

Bu davranışı tekrar argümanı için bir varsayılan değer belirleyerek değiştirebiliriz.Default değer önerilir.

# f <- function(tekrar = 1) {
#         Merhaba <- "Merhaba!\n"
#         for(i in seq_len(tekrar)) {
#                 cat(Merhaba)
#         }
#         chars <- nchar(Merhaba) * tekrar
#         chars
# }
# f()    ## 'tekrar' için varsayılan değeri kullan
# f(2)   ## Kullanıcı tarafından belirtilen değeri kullan

Argüman Eşleştirme

taslak:

fonksiyon_adi <- function(sayi=1){

}
fonksiyon_adi <- function(sayi=1,satir=c(5),sutun=c(10)){

}
fonksiyon_adi <- function(sayi=1,satir=c(5),sutun=c(10)){

    df <- data.frame(matrix(0,nrow=satir, ncol=sutun))
     writexl::write_xlsx(df,"veri_1.xlsx")
}
fonksiyon_adi(sayi=1,satir=c(5),sutun=c(10))

Şimdi ise bu fonksiyonu çoklu dosya yazımına uygun hale getirelim

fonksiyon_adi <- function(sayi=3,satir=c(5,5,5),sutun=c(10,10,10)){
    
  df_list <- list() ## her bir veri setinin atanacağı yeni nesne
    
    for( i in 1:sayi){
    df_list [[i]] <- data.frame(matrix(0,nrow=satir[i], ncol=sutun[i])) # veri seti istenilen ozelliklerde olusturulur
     for(j in 1:sutun[i]){
      df_list[[i]][,j] <- round(rnorm(satir[i],0,1),2) #  her bir veri setinin her bir sütunu standart normal dağılıma uygun uretilir
      writexl::write_xlsx(df_list[[i]],paste("veri",i,".xlsx", sep=""))
    }}
     
}
fonksiyon_adi(sayi=3,satir=c(5,4,3),sutun=c(10,5,4))

bunu çeşitli şekillerde deneyebiliriz.

SIRA SİZDE: