Ders Tekrarı Notları

ÖNEMLİ NOT!!!: Hocam geçen haftaki ödevleri ben yapmıştım geçen hafta yayınladığım Rpubs dosyasında (2 Aralık Dersi Ödevi) bulabilirsiniz, ona da bakın lütfen, bu ödev 9 Aralık dersi öğrendiklerimize ilişkin ödevdir.

R’da … Argümanı

Fonksiyon tanımlarında kullanılan … operatörü, sayısı veya ismi önceden bilinmeyen argümanların fonksiyona kabul edilmesini sağlayan bir esneklik aracıdır.

  1. Bir fonksiyonun içine gömülen başka bir temel fonksiyona (örneğin plot), kullanıcının girdiği ek parametreleri (renk, etiket vb.) değiştirmeden iletmek için kullanılır.

  2. paste(), cat() veya sum() gibi fonksiyonlarda olduğu gibi, kullanıcının kaç tane veri gireceğinin (1 tane de olabilir, 100 tane de) belli olmadığı durumlarda tüm girdileri yakalamak için kullanılır.

  3. … argümanından sonra gelen argümanlar (örneğin paste fonksiyonundaki sep argümanı) çok katı kurallara tabidir:

Tam İsim Zorunluluğu: Argümanın adı eksiksiz yazılmalıdır (sep = “:” gibi).

Kısmi Eşleşme Yoktur: R, se = “:” gibi kısaltmaları tanımaz, bunları verinin bir parçası sanar.

args(paste)
## function (..., sep = " ", collapse = NULL, recycle0 = FALSE) 
## NULL
args(plot)
## function (x, y, ...) 
## NULL

Çoklu veri seti oluşturma ve dışarı aktarma

Derste otomatik olarak artan boyutlarda veri setleri üreten ve bunları Excel dosyası olarak kaydeden bir fonksiyon oluşturmuştuk:

df<-list()
veri_sim<- function(tekrar=1, satir,sutun){
     for(i in 1:tekrar){ 
       set.seed(i)
     df[[i]]<- data.frame(matrix(sample(1:100,satir[i]*sutun[i],replace=TRUE), nrow=satir[i], ncol=sutun[i]))
     writexl::write_xlsx(df[[i]],        paste("sim/veri_",i,".xlsx",sep=""))
     }
}
veri_sim(tekrar=15,satir=1:15, sutun=1:15)

While For döngüsünün aksine, tekrar sayısının baştan belli olmadığı durumlarda kullanılır.

AKIŞ: Koşulu kontrol et.

Koşul Doğru (TRUE) ise süslü parantez { } içindeki kodları çalıştır.

Tekrar başa dön ve koşulu kontrol et.

Koşul Yanlış (FALSE) olduğu anda döngü biter.

Sonsuz döngü tehlikesi olduğundan, döngünün içinde, koşulu değiştirecek bir hamle (artırma/azaltma gibi) mutlaka yapılmalıdır.

Birden fazla koşul && (ve) operatörü ile bağlanabilir.

R, koşulları soldan sağa doğru değerlendirir. Eğer soldaki ilk koşul sağlanmıyorsa, sağdakine bakmaya gerek duymaz ve döngüden çıkar.

Repeat While döngüsünden farkı, hiçbir koşula bakmadan doğrudan döngüyü başlatmasıdır.

Döngü sonsuzdur.

Durdurmanın tek yolu, döngü içine bir if koşulu yazıp break komutunu kullanmaktır.

Genellikle matematiksel hesaplamalarda, bir sonuca yakınsayana kadar (iterasyon) işlem yapmak gerektiğinde kullanılır.

Eğer aradığın sonuca asla ulaşılamazsa (sayılar bir ileri bir geri giderse), bu döngü asla durmaz.

Bu yüzden genellikle repeat yerine, maksimum deneme sayısı belli olan bir for döngüsü kullanmayı tercih ederler.

Alıştırmalar

Geometrik Ortalama Denemesi

Adımlar

  1. Hepsini Çarp: Elindeki vektörün içindeki tüm sayıları birbirleriyle çarp.

  2. Adedi Bul: Vektörün içinde kaç tane sayı olduğunu (uzunluğunu) bul.

  3. Kökünü Al: Bulduğun çarpım sonucunun, sayı adedi (n) derecesinden kökünü al.

geom_ort<- function(x){ 
  if(any(x<=0)) {
    stop("HATA:Geometrik ortalama hesaplanacak tüm değerler pozitif olmalıdır.")
  }
 carpım<- prod(x)   #  prod(): tüm elemanları tek seferde çarpan fonksiyon
 n<- length(x)
 sonuc<- carpım^(1/n)   #  Bir sayının n. dereceden kökünü almak, o sayının (1/n). kuvvetini (üssünü) almak demektir.
 
 return(sonuc)
}

Deneme

x<-c(seq(10,100,5))
y<-c(seq(-100,0,10))

geom_ort(x)
## [1] 46.41526

5.7.1 Soruları

Soru 1

For döngüsü ile boş bir veri setinin sütunlarını farklı şekillerde oluşturma (Toplam 7 sütun oluşturacağız: 3 Kategorik + 4 Sürekli)

n_gozlem <- 10 

df <- data.frame(row.names = 1:n_gozlem)

# Döngü: Toplam 7 sütun (3 Kategorik + 4 Sürekli)
for (i in 1:7) {
  
  if (i <= 3) {
    # İLK 3 SÜTUN: Kategorik (Örn: A, B, C grupları)
    # sample() fonksiyonu rastgele harf seçer.
    df[, i] <- sample(c("Grup A", "Grup B", "Grup C"), n_gozlem, replace = TRUE)
    
  } else {
    # DİĞER 4 SÜTUN: Sürekli (Örn: Normal dağılım sayıları)
    # rnorm() fonksiyonu rastgele sayı üretir.
    df[, i] <- rnorm(n_gozlem, mean = 50, sd = 10)
  }
  
  # Sütunlara isim verme 
  colnames(df)[i] <- paste0("Degisken_", i)
}

# 4. Sonuç
print(df)
##    Degisken_1 Degisken_2 Degisken_3 Degisken_4 Degisken_5 Degisken_6 Degisken_7
## 1      Grup A     Grup B     Grup A   48.57530   50.66142   41.96633   63.30205
## 2      Grup B     Grup A     Grup B   29.09912   47.06808   70.73553   55.76156
## 3      Grup A     Grup B     Grup C   28.40910   26.94999   60.29190   43.88013
## 4      Grup C     Grup C     Grup C   51.97552   51.10988   58.76848   43.27981
## 5      Grup A     Grup B     Grup A   45.50330   56.07185   65.96813   62.82784
## 6      Grup A     Grup B     Grup B   38.06780   44.81115   53.61630   50.21979
## 7      Grup A     Grup C     Grup A   58.51746   54.20784   60.14646   62.94419
## 8      Grup C     Grup B     Grup A   36.72620   47.06479   57.16543   35.07579
## 9      Grup C     Grup A     Grup C   50.66642   67.72533   38.54691   29.11561
## 10     Grup C     Grup C     Grup B   49.85820   48.91217   39.90958   36.82123

Sanal Sınıf ve Sınav Notu Oluşturma Fonksiyonu (Ekstra deneme)

df<-list()
sanal_sinif<- function(sinif_sayisi=1){
     for(i in 1:sinif_sayisi){ 
     set.seed(i)
     n <- sample(10:30, 1)    
    df[[i]] <- data.frame(
      Ogrenci_No = 1:n,  # 1'den n'e kadar sayı
      Cinsiyet   = sample(c("Kadin", "Erkek"), n, replace=TRUE), # n tane cinsiyet 
      Sinav_Puani = round(rnorm(n, mean=70, sd=10))# n tane not 
       )
     writexl::write_xlsx(df[[i]], paste0("sinif_",i,".xlsx"))
     }
}

sanal_sinif(sinif_sayisi=5)

Soru 2

Tüm verileri 0 olan farklı boyutlarda veri setleri oluşturup bu veri setlerini çalışma alanında yazdırma

liste1<-list()
bos_veri<- function(tekrar=1, satir, sutun)
  {for(i in 1:tekrar) { 
  liste1[[i]]<- data.frame(matrix(0, nrow=satir[i], ncol=sutun[i]))
  writexl::write_xlsx(liste1[[i]], paste0("liste_", i, ".xlsx"))
}
 }
bos_veri(tekrar=3, satir=c(3, 10, 50), sutun=c(2, 2, 5))

Soru 3

For döngüsü ile liste kullanımı anlamak için PISA veri setinden farklı boyutlarda veri setleri çekip bu veri setlerini çalışma alanına yazdırma

pisa_2022_tur_full <- readRDS("pisa_2022_tur_full.rds")

veri_parcalayici<- function(veri,kesilecek_miktar) { 
  sonuc_listesi<-list()
  
  for(i in 1:length(kesilecek_miktar)) {
    hedef_sayi<-kesilecek_miktar[i]
    kesilen_veri <- veri[1:hedef_sayi, ]
    sonuc_listesi[[i]] <- kesilen_veri
    writexl::write_xlsx(sonuc_listesi[[i]], paste0("Pisa_Verisi_", hedef_sayi, "_Satir_Parca_", i, ".xlsx"))
  }
  return(sonuc_listesi)
}


sonuclar<- veri_parcalayici(pisa_2022_tur_full, 10)
sonuclar[[1]]

Soru 4

For döngüsü ile çalışma alanlarındaki veri setlerini okuyup, her bir bir seti için özet bilgileri bir listede saklama

veri_ozetle <- function(tekrar) {
  
  ozetler <- list()
  
  for(i in 1:tekrar) {
    
    gecici_veri <- readxl::read_excel(paste0("sim/veri_", i, ".xlsx") )
    
    ozetler[[i]] <- summary(gecici_veri)
  }

  return(ozetler)
}

sonuc_listesi <- veri_ozetle(15)

# 15. dosyanın özetine bakmak için:
print(sonuc_listesi[[15]])
##        X1             X2              X3              X4              X5      
##  Min.   : 5.0   Min.   : 2.00   Min.   : 2.00   Min.   : 6.00   Min.   : 8.0  
##  1st Qu.:29.5   1st Qu.:32.00   1st Qu.:30.00   1st Qu.:37.00   1st Qu.:20.5  
##  Median :38.0   Median :58.00   Median :58.00   Median :49.00   Median :44.0  
##  Mean   :47.6   Mean   :55.53   Mean   :50.67   Mean   :55.93   Mean   :44.8  
##  3rd Qu.:71.0   3rd Qu.:82.00   3rd Qu.:74.50   3rd Qu.:78.00   3rd Qu.:62.5  
##  Max.   :89.0   Max.   :99.00   Max.   :95.00   Max.   :98.00   Max.   :95.0  
##        X6              X7             X8             X9              X10       
##  Min.   : 6.00   Min.   : 5.0   Min.   : 3.0   Min.   :  2.00   Min.   : 3.00  
##  1st Qu.:28.00   1st Qu.:18.0   1st Qu.:28.0   1st Qu.: 19.00   1st Qu.:28.00  
##  Median :47.00   Median :40.0   Median :64.0   Median : 47.00   Median :51.00  
##  Mean   :47.93   Mean   :44.8   Mean   :50.2   Mean   : 46.13   Mean   :53.33  
##  3rd Qu.:65.50   3rd Qu.:69.5   3rd Qu.:71.5   3rd Qu.: 79.50   3rd Qu.:82.00  
##  Max.   :98.00   Max.   :90.0   Max.   :87.0   Max.   :100.00   Max.   :96.00  
##       X11             X12             X13             X14            X15       
##  Min.   : 8.00   Min.   :15.00   Min.   : 1.00   Min.   : 6.0   Min.   : 7.00  
##  1st Qu.:15.50   1st Qu.:34.00   1st Qu.:39.50   1st Qu.:32.5   1st Qu.:38.00  
##  Median :42.00   Median :61.00   Median :57.00   Median :40.0   Median :51.00  
##  Mean   :43.93   Mean   :58.27   Mean   :57.53   Mean   :45.6   Mean   :51.87  
##  3rd Qu.:73.00   3rd Qu.:79.50   3rd Qu.:79.50   3rd Qu.:55.5   3rd Qu.:64.50  
##  Max.   :94.00   Max.   :99.00   Max.   :93.00   Max.   :96.0   Max.   :85.00

8.2. Sorular

Soru 1 ve soru 2 sınıfta çözülmüştü.

Soru 3.

Örnek veri seti oluşturma kodları sorda verilmiş:

 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

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

Eğer veri setinde herhangi 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.

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

Soru 4. Kodlarla geometrik şekilleri oluşturma

  1. İçi dolu kare
n <- 5 

for(i in 1:n) {
  cat(rep("* ", n), "\n")
  }
## *  *  *  *  *  
## *  *  *  *  *  
## *  *  *  *  *  
## *  *  *  *  *  
## *  *  *  *  *
  1. İç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")         
}
## * * * * * 
## *       * 
## *       * 
## *       * 
## * * * * *
  1. Dolu üçgen
n <- 5

for (i in 1:n) {
  cat(rep("*", i), "\n")
}
## * 
## * * 
## * * * 
## * * * * 
## * * * * *
  1. Eşkenar üçgen
n <- 5 # Yükseklik

for(i in 1:n) {
  
  # 1. ADIM: Önce Boşlukları Bas (Soldan itmek için)
  # Kural: n - i kadar boşluk
  if(i < n) { # Son satırda boşluk yok, hata vermesin diye if koyduk
    for(k in 1:(n - i)) {
      cat(" ") 
    }
  }
  
  # 2. ADIM: Sonra Yıldızları Bas
  # Kural: 2*i - 1 kadar yıldız (1, 3, 5, 7...)
  for(j in 1:(2 * i - 1)) {
    cat("*")
  }
  
  # 3. ADIM: Alt Satıra Geç
  cat("\n")
}
##     *
##    ***
##   *****
##  *******
## *********
  1. İçi boş eşkenar üçgen
n <- 5 # Yükseklik

for(i in 1:n) {
  
  # 1. ADIM: Hizalama Boşlukları (Soldan itmek için)
  if(i < n) {
    for(k in 1:(n - i)) {
      cat(" ") 
    }
  }
  
  # 2. ADIM: Şekli Çizme (Yıldız mı Boşluk mu?)
  # O satırdaki toplam karakter sayısı: 2*i - 1
  genislik <- 2 * i - 1
  
  for(j in 1:genislik) {
    
    # Kural: 
    # 1. En alt satırsa (i == n) -> Hepsi Yıldız
    # 2. Satırın başıysa (j == 1) -> Yıldız
    # 3. Satırın sonuysa (j == genislik) -> Yıldız
    
    if(i == n || j == 1 || j == genislik) {
      cat("*")
    } else {
      cat(" ") # İçerisi boş
    }
  }
  
  # 3. ADIM: Alt Satıra Geç
  cat("\n")
}
##     *
##    * *
##   *   *
##  *     *
## *********
  1. Dik üçgen
n <- 5 # Yükseklik

for(i in 1:n) {
  
  # 1. ADIM: Boşlukları Bas (Sağa yaslamak için)
  # Kural: n - i tane boşluk
  if(i < n) { # Son satırda boşluk basmaya çalışıp hata vermesin
    for(k in 1:(n - i)) {
      cat(" ") 
    }
  }
  
  # 2. ADIM: Yıldızları Bas
  # Kural: i tane yıldız
  for(j in 1:i) {
    cat("*")
  }
  
  # 3. ADIM: Alt Satıra Geç
  cat("\n")
}
##     *
##    **
##   ***
##  ****
## *****
  1. Diyagonal çizgi
n <- 5 # Uzunluk

for(i in 1:n) {
  
  # İç döngü: Sadece o satırın numarasına (i) kadar gitmesi yeterli
  # Çünkü yıldızı koyduktan sonra sağ tarafı boş bırakabiliriz.
  for(j in 1:i) {
    
    if(i == j) {
      cat("*") # Satır ve Sütun eşitse Yıldız
    } else {
      cat(" ") # Değilse (yıldıza gelene kadar) Boşluk
    }
    
  }
  
  cat("\n") # Alt satıra geç
}
## *
##  *
##   *
##    *
##     *

Öğrenme Günlüğüm

Her zamanki gibi önce ders notlarını tekrar ettim ve özetledim.Sonra konu anlatımındaki alıştırma sorularını yapmaya çalıştım.Kullanıcılarla etkileşime giren readline() fonksiyonunu sevdim. Fonksiyonları ve for döngülerini ayrı ayrı yazmak benim için daha kolayken, ikisini birleştirince, yazılan kod satırları arttıkça birazcık işler karışıyor. Soru 3 de bir türlü sizin çıktınızla aynı sonucu elde edemedim, bir mantık ya da sıralama hatası var ama bulamadım. Geometrik şekilleri oluştumak beni zorladı yardım almak zorunda kaldım ama mantığını anlamak için elimden geleni yaptım. Sanırım içi içe döngülerine biraz daha çalışmam lazım. Daha R konusunda uzun ince bir yol var önümde…