Öğrenme Günlüğüm

Bu haftaki (09.12.2025) derste fonksiyonlarda function() ile kendi fonksiyonumu tanımlamanın, sürekli kopyala-yapıştır yaptığım kodları tek yere toplamak için çok işe yaradığını fark ettim. Argümanlara varsayılan değer verme mantığı da (örneğin tekrar = 1 gibi), her seferinde aynı şeyi yazmak zorunda kalmamak açısından pratik geldi. Derste de sorduğum gibi önceden bir fonksiyon tanımlasak ve bunu sürekli uygulayabilsek kısmı benim için çok pratik ve aslında R’da kullandığımız çoğu fonksiyon da önceden tanımlanmış ve belli kalıpları olan fonksiyonlar. Ben de kendi kalıp fonksiyonlarımı yazıp kullanabilirim. Ayrıca ... yapısının, var olan bir fonksiyonu genişletirken (örneğin kendi myplot() fonksiyonumun içinde plot() kullanırken) fonksiyon daha önceden tanımlıysa bu fonksiyondaki tüm ek argümanları aynen aktarmak için kullanıldığını öğrendim. Burada ...’dan sonra gelen argümanların tam adıyla yazılması gerekir” detayı (örneğin sep =, collapse =) aklımda özellikle kaldı.

Geometrik ortalamada, iki farklı hesaplama yolu (doğrudan çarpım ve logaritmik yöntem) için tek bir fonksiyon yazdık, sonra da psych paketindeki geometric.mean() fonksiyonu ile karşılaştırdık. Burada if (any(x <= 0)) stop("...") yazarak, fonksiyonun çalışmadığında ya da yanlış bir değer verildiğinde kendini durdurmasını sağlayabileceğimizi görmek, ileride kendi fonksiyonlarımda da kullanmam gereken bir yapı gibi, hata yapmamı minimize etmeye yarayacak. Çoklu veri seti oluşturma ve dışarı aktarma kısmında fonksiyon_adi <- function(sayi, satir, sutun){ … } yapısında önce bir df_list oluşturup, for (i in 1:sayi) ile her adımda istenen satır/sütun boyutunda veri seti üretip listeye attık. Daha sonra writexl::write_xlsx(df_list[[i]], paste(“veri”, i, “.xlsx”, sep = ““)) ile her birini ayrı dosya olarak kaydedebildiğimizi gördüm. Burada özellikle [[i]] kullanımı (liste elemanına erişim) ve satir[i], sutun[i] kafamı karıştırıyordu. Nerede köşeli parantez nerede küme parantezi kullanmam gerektiğini ders esnasında içimden tekrar ede ede gittim 😅

Kontrol yapıları tarafında if , else, else if ve ifelse()’in kullanımınlarını dersin ilk haftalarında görmüştük fakat daha bu hafta daha detaylı gördük ben mantıklarını tam kavrayamamışım ilk haftalarda. ifelse() ile tek tek döngü yazmadan, bir vektördeki tüm elemanları aynı anda “tek/çift”, “pozitif/negatif/sıfır” gibi kategorilere ayırabilmek çok işimize yaratacak bence. all() ve any() fonksiyonlarının da, bir koşulun tüm elemanlar için mi yoksa en az bir eleman için mi geçerli olduğunu kontrol etmekte kullanıldığını öğrendim. for döngüsünü hem indeks (for (i in 1:10)) hem de doğrudan nesnenin elemanları üzerinden (for (değer in x)) kullanabileceğimi gördüm. Büyük matris örneğinde, aynı işlemi hem iç içe for döngüleriyle hem de vektörleştirilmiş olarak (y^2) yaptığımızda, döngüsüz çözümün ne kadar hızlı olduğunu fark ettim. While ve repeat döngülerinde ise koşulu yanlış kurduğumda sonsuz döngüye girme ihtimalini gözlerimle gördüm, hatta içimden ilk dediğim şey “Bu tam da benim yapacağım bir hataya benziyor😅” oldu, bu kısımda break kullanmanın önemini gördüm.

8.2 Ödevler

İlk iki soruyu derste yaptığımız için üçüncü sorudan başladım.

Soru 3:

Veri setindeki her satıra tek tek bakılması gerektiği için for (i in 1:nrow(ornek)) mantığıyla satırlara baktım. Burada amacım her satır için “negatif var mı?” sorusunu cevaplamak ve ona göre farklı çıktı üretmekti. Satırı almak için ornek[i, ] kullandım çünkü o an kontrol ettiğim satırın tüm sütunlarını tek seferde görmek istedim. Her satırda negatif olup olmadığını anlamak için satırdaki elemanların < 0 durumunu kontrol ettim. Eğer satırda en az bir negatif varsa bu sefer ortalama almak yerine “Satir i negatif sayi icermektedir.” mesajını yazdırdım. if ve else’i iki farklı çıktı davranışı için kullandım. Son olarak “toplam negatif sayı üçü geçerse dur” şartı için negatif görülen her satırdan sonra toplam negatif sayıyı artırıp if (negatif_toplam > 3) yaptım. Bu koşul sağlanınca “cok sayıda negatif sayi” yazdırıp break ile döngüyü durdurdum.

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
}

negatif_toplam <- 0 

for (i in 1:nrow(ornek)) {
  satir <- ornek[i, ]
  
  satir_negatif_sayisi <- sum(satir < 0)
  
  if (satir_negatif_sayisi == 0) {
    ort <- mean(satir)
    cat("Satir", i, "ortalamasi", ort, "\n")
  } else {
    cat("Satir", i, "negatif sayi icermektedir.\n")
    negatif_toplam <- negatif_toplam + satir_negatif_sayisi
    if (negatif_toplam > 3) {
      cat("Cok sayida negatif sayi\n")
      break
    }
  }
}
## 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.
## Cok sayida negatif sayi

Soru 4:

  1. İçi dolu kare:

Her satırın aynı görünmesi gerektiği için her satırda n tane yıldız ürettirdim. Bunu rep(“*“, n) ile yaptım. Sonra yan yana düzgün dursun diye paste(…, collapse=” “) ile araya boşluk koyarak birleştirdim. Döngüyü n kez çalıştırınca kare tamamlandı.

n <- 5
for (i in 1:n) {
  cat(paste(rep("*", n), collapse = " "), "\n")
}
## * * * * * 
## * * * * * 
## * * * * * 
## * * * * * 
## * * * * *
  1. İçi boş kare

Kenarlar yıldız, içi boşluk olduğu için satır ve sütun şeklinde düşündüm. Kenarda olup olmadığını anlamak için i==1, i==n, j==1, j==n koşullarını kullandım. Bu koşullardan biri doğruysa *, değilse boşluk yazdırdım. Bunu yapma sebebim iç kısmın tamamen boş kalması ve sadece çerçevenin çıkmasıydı.

n <- 5
for (i in 1:n) {
  satir <- character(n)
  for (j in 1:n) {
    if (i == 1 || i == n || j == 1 || j == n) {
      satir[j] <- "*"
    } else {
      satir[j] <- " "
    }
  }
  cat(paste(satir, collapse = " "), "\n")
}
## * * * * * 
## *       * 
## *       * 
## *       * 
## * * * * *
  1. Dolu üçgen

Burada her satırda yıldız sayısının artması gerekiyor. Bu yüzden satır numarasını doğrudan yıldız sayısı yaptım: 1. satır 1 yıldız, 2. satır 2 yıldız gibi. Burada rep(“*“, i) kullanmamın nedeni yıldız sayısını satır ilerledikçe otomatik büyütmekti.

n <- 5
for (i in 1:n) {
  cat(paste(rep("*", i), collapse = " "), "\n")
}
## * 
## * * 
## * * * 
## * * * * 
## * * * * *
  1. İçi dolu eşkenar üçgen

Buradasola boşluk vererek üçgeni ortalamam gerekiyordu. O yüzden soldaki boşluğu n-i, yıldız sayısını da 2*i-1 şeklinde yazdım. Buradaki 2*i-1 kısmını eşkenar üçgende yıldız sayısı 1,3,5,7 diye tek sayılar şeklinde arttığı için kullandım.

n <- 5
for (i in 1:n) {
  bosluk <- n - i
  yildiz <- 2 * i - 1
  cat(strrep(" ", bosluk), strrep("*", yildiz), "\n", sep = "")
}
##     *
##    ***
##   *****
##  *******
## *********
  1. İçi boş eşkenar üçgen:

Burada üç farklı satır tipi olduğunu hayal ettim. Bunlar tepe satırı, orta satırlar ve taban satırı. Tepe satırında tek yıldız var, tabanda tamamen yıldız var, orta satırlarda ise iki yıldızın arasını boşlukla doldurmak gerekiyordu. Bu yüzden if (i==1), else if (i==n) şeklinde yazdım aradaki satırlarda da dış boşluk + yıldız + iç boşluk + yıldız mantığını kullandım.

n <- 5
for (i in 1:n) {
  if (i == 1) {
    cat(strrep(" ", n - 1), "*\n", sep = "")
  } else if (i == n) {
    
    cat(strrep("*", 2 * n - 1), "\n")
  } else {
    bosluk_dis <- n - i
    bosluk_ic  <- 2 * i - 3
    cat(strrep(" ", bosluk_dis), "*",
        strrep(" ", bosluk_ic), "*\n", sep = "")
  }
}
##     *
##    * *
##   *   *
##  *     *
## *********
  1. Dik üçgen:

Burada yıldızları her satırda sağa yaslamak için satır başına boşluk ekledim. Yani önce n-i kadar boşluk, sonra i kadar yıldız yazdırdım. Bunu böyle yapmamın nedeni boşluklar azalırken yıldızlar artınca çizim sağa doğru düzgün bir üçgen gibi görünüyor.

n <- 5
for (i in 1:n) {
  cat(strrep(" ", n - i), strrep("*", i), "\n", sep = "")
}
##     *
##    **
##   ***
##  ****
## *****
  1. Diyagonal çizgi:

Buradayda her satırda sadece 1 yıldız var ama konumu satır numarasına göre kayıyor. Bu yüzden i-1 kadar boşluk koyup sonra * olsun dedim. Soruda iki tane diyagonal çizgi olduğu için de aynı kodu iki kere yazdım.

n <- 5
for (i in 1:n) {
  cat(strrep(" ", i - 1), "*\n", sep = "")
}
## *
##  *
##   *
##    *
##     *
for (i in 1:n) {
  cat(strrep(" ", i - 1), "*\n", sep = "")
}
## *
##  *
##   *
##    *
##     *