Bölüm 2 R Programlama Dili

Kazanımlar

R programlama dilinin istatiksel hesaplama ve görselleştimeye yönelik bir programlama dili olduğundan bahsetmiştik. Rstudio programı çalıştırıldığında Şekil 2.1 deki arayüz açılır.

Rstudio programlama ortamı

Şekil 2.1: Rstudio programlama ortamı

Basit kodlar için ‘Console’ sekmesini kullanarak her bir kod satırını tek tek çalıştıra bilirsiniz. Yeni bir Rscript dosyası oluşturarak kodlarınızı topluca çalıştırabilirsiniz. Önce basit kodlar ile başlayalım. Ekrana “Merhaba Sınıf” yazısı yazdırarak başlayalım. Bunun için “Console” (etkileşimli kabuk) a tırnak işaretleri içinde “Merhaba Sınıf” yazmak yeterli. ??

"Merhaba sınıf"
## [1] "Merhaba sınıf"

2.1 Karakterlere Giriş

Yukarıda kullandığımız "Merhaba Sınıf" ifadesi character (karakter) sınıfına aittir. Gördüğünüz gibi karakter sınıfına ait ifadeler tırnak işaretleri arasına yazılan karakterden/karakterlerden oluşur. Tırnak işaretleri arasına yazılmazsa hata verecektir.

Merhaba Sınıf
## Error: <text>:1:9: unexpected symbol
## 1: Merhaba Sınıf
##             ^

Etkileşimli kabuk üzerinde çalışmıyorsanız ekranda mesaj göstermek için print veya cat fonksiyonu kullanılabilir. (!) cat fonksiyonunu tanıt!

print("Merhaba Sınıf")
## [1] "Merhaba Sınıf"

cat("Merhaba Sınıf")
## Merhaba Sınıf

print fonksiyonuyla çıktı alırken birden fazla değer girilemez. Ancak paste fonksiyonu kullanılarak ifadeler birleştirilebilir. Örneğin ekrana 3 ve 5 in toplamının kaç olduğunu eşitlik olarak göstermek için aşağıdaki kod kullanılabilir.

# "3 + 5 = 8"
paste("3 + 5 =", 3 + 5)
## [1] "3 + 5 = 8"

paste fonksiyonunda sep parametresine bir değer eklenirse birleştirme işlemi buna göre yapılır (sep parametresinin öntanımlı değeri " "(boşluk) dur). Örneğin sep parametresini " = " olarak seçip aşağıdaki kodu inceleyelim.

# "3 + 5 = 8"
paste("3 + 5", 3 + 5 , sep=" = ")
## [1] "3 + 5 = 8"

Kullanıcıdan veri almak için readline fonksiyonu kullanılır. Bu fonksiyon kullanıcının girdiği değeri karakter olarak alır. Parametre olarak isteyeğiniz değeri tanımlayan bir yazı yazabilirsiniz. Aşağıda readline fonksiyonuyla ilgili örnekler verilmiştir.

# kullanıcıdan şehir ismi isteyen kod
readline("Lütfen bulunduğunuz şehrin adını giriniz: ")

# kullanıcıdan sayı isteyen kodn
readline("Lütfen bir sayı giriniz: ")
# burada girilen sayı karakter sınıfına ait olacaktır.
# sayısay işlemlere tabi tutulduğunda hataya sebep olacaktır

2.2 Sayılara Giriş

Matematikte kullandığımız şekliyle kullanabileceğimiz ifadelerdir. Toplama, çıkarma ve bölme aynı şekilde kullanılsa da çarpma operatörü klavyedeki yıldız işareti ile gösterilir. Ayrıca mod, bölüm ve üs operatörleri de bulunmaktadır. Bunlar sırasıyla %%, %/% ve ** veya ^ işaretleridir.

# toplama
8 + 3
## [1] 11

# çıkarma 
15 - 2
## [1] 13

# bölme
12 / 6
## [1] 2

# çarpma
5 * 3
## [1] 15

# mod (kalan)
8 %% 3
## [1] 2

# bölüm
154 %/% 8
## [1] 19

# üs operatörü için 2 seçenek vardır
# Birincisi '^' dır
# Diğeri '**' dır
2 ^ 3
## [1] 8
2 ** 3
## [1] 8

Sayılar ve karakterler aslında vektör denen veri türünün sınıflarıdır. Daha Sonra detaylı olarak anlatılacak fakat basitçe açıklayalım. Vektör veri türü c() isimli fonksiyon yardımıyla oluşturulur ve aynı sınıfa ait birden fazla değer içerebilir.

c(1,5,6, 3, "8", NA)
## [1] "1" "5" "6" "3" "8" NA

2.3 Değişken Tanımlama

Değişkenler verileri tutmak için kullanılan kelimelerdir. Değişken tanımlarken ilk olarak dikkat edilmesi gereken seçilen kelimenin R programlama dilini bir anahtar kelimesi olmamasıdır. Yani Aşağıdaki kelimeler ile değilken tanımlanamaz. (Not: bu kelimelere konsolda ?reserved yazarak ulaşılabilir)

  • if
  • else
  • while
  • repeat
  • for
  • function
  • in
  • next
  • break
  • TRUE
  • FALSE
  • NULL
  • Inf
  • NaN
  • NA
  • NA_integer
  • NA_real
  • NA_complex_
  • NA_character_

Bunlar dışında dikkat edilmesi gerekenlerden biri Türkçe karakter içermemesi diğeri boşluk içermemeli. Yani alinin top sayısı şeklinde bir değişken oluşturulamaz. Bunun yerine Türkçe ‘ı’ karekterlerini değiştirip ‘i’ olarak kullanmak ve boşlukları da nokta veya ‘_’ işaretiyle değiştirirsek alinin.top.sayisi şeklinde değişken oluşturabiliriz. Veya boşlukları atıp ilk kelime hariç sonraki kelimelerin baş harflerini büyük yazarak da değişken oluşturabiliriz. Örneğin alininTopSayisi şeklinde de değişken oluşturabiliriz. R programlama dilinde genellikle boşluk yerine nokta kullanılır ve ilk karakter ya nokta ya da küçük harf olur.

Ayrıca ilk karakter nokta veya harf olmak zorundadır. Değişken tanımlanırken atama operatörlerinden (<-, =, ->) biri kullanılır. Örnekleri inceleyelim.

# '=' ve '<-' sola doğru atama için kullanılır
# Örneğin a değikenine 3 değerini atamak için
# a = 3 veya a <- 3 kullanılır
# ya da '->' ile de atama yapılabilir fakat 
# bu durumda soldaki değer sağdaki ifadedye atanır
# yani a değişkenine 3 değerini atamak için 
# 3 -> a efadesi de kullanılabilir

# nokta ile başlayan değişken oluşturulabilir
.ali = 15
paste(".ali deşkeninin değeri", .ali)
## [1] ".ali deşkeninin değeri 15"

# her hangi bir harf ile başlayabilir
top.sayisi = 3
paste("top.sayisi değişkeninin değeri", top.sayisi)
## [1] "top.sayisi değişkeninin değeri 3"

# sağa doğru atama
"matematik" -> ders.adi
paste("ders.adi değişkeninin değeri", ders.adi)
## [1] "ders.adi değişkeninin değeri matematik"

# diğer örnekler
degisken1 <- "merhaba"
degisken2 = "dünya"
ucgen.ic.acisi = 180
ucgenIcAcisi = 180

print(paste(degisken1, degisken2))
## [1] "merhaba dünya"
ucgen.ic.acisi
## [1] 180

2.4 If-else Yapısı

if-else yapısı belirlenen karşılaştırmanın sonucuna göre programın farklı şekilde ilerlemesini sağlayan yapıdır. En basit şekilde if (koşul) {koşul doğru olduğunda yapılacaklar} uygulanır. Örneğin seçilen sayı çift isi bunu ekrana yazdıran kod aşağıdaki şekildeki gibidir.

# 4 çift sayı olduğundan if koşulu doğru olacak
# ve if bloğu çalıştırılacak
sayi = 4
if (sayi %%2 == 0){
    print("girilen sayısı çifttir")
}
## [1] "girilen sayısı çifttir"

# ancak sayi 5 olarak seçildiğinde 5 tek sayı olduğundan
# karşılaştırma sonucu yanlış olacak ve if bloğu çalıştırılmayacak
sayi = 5
if (sayi %%2 == 0){
    print("girilen sayısı çifttir")
}

Bu örnekte sayı eğer çift ise ekrana ‘girilen sayı çifttir’ yazdıracak değilse hiçbir şey yazdırmayacak. Eğer durumun tersi için de işlemler tanımlamak istersek bu durumda else yapısını da eklemeliyiz. Önceki örneği geliştirirsek yani sayı çift ise ekrana çift değilse ekrana tek yazılması istersek bunu aşağıdaki gibi yapabiliriz.

# 4 çift sayı olduğundan if koşulu doğru olacak
# ve if bloğu çalıştırılacak
sayi = 4
if (sayi %%2 == 0){
    print("girilen sayısı çifttir")
}else{ # if koşulu sağlanmadığı durumlar da çalıştırılacak 
    print("girilen sayı tekdir")
}
## [1] "girilen sayısı çifttir"

# ancak sayi 5 olarak seçildiğinde 5 tek sayı olduğundan
# karşılaştırma sonucu yanlış olacak ve if bloğu çalıştırılmayacak
# else bloğu çalıştırılacak ve sonuç olarak "girilen sayı tekdir" 
# ifadesi ekranda görünecektir
sayi = 5
if (sayi %%2 == 0){
    print("girilen sayısı çifttir")
}else{ # if koşulu sağlanmadığı durumlar da çalıştırılacak 
    print("girilen sayı tekdir")
}
## [1] "girilen sayı tekdir"

Her zaman tek bir koşul ile işlem yapılmayabilir. Bu gibi durumlarda else if yapısı devreye girer. Örneğin yüzlük sistemdeki notların beşlik sistemdeki karşılığını bulan kod aşağıdaki şekildedir.

not = 78
if(not >= 85){
    beslik = 5
}else if(not >= 70){
    beslik = 4
}else if(not >= 55){
    beslik = 3
}else if(not >= 45){
    beslik = 2
}else if(not >= 25){
    beslik = 1
}else{
    beslik = 0
}

paste(not, "puanının beşlik sistemdeki karşılığı", beslik, "dir")
## [1] "78 puanının beşlik sistemdeki karşılığı 4 dir"

Kodu incelersek eğer not 90 ise 85 değerinden büyük olacağından sadece ilk blok çalıştırılır ve ekrana “90 puanının beşlik sistemdeki karşılığı 5 dir” şeklinde mesaj yazılır. Eğer not 78 ise 85 de küçük olduğundan ilk blok çalıştırılmaz ama 70 den büyük olduğundan 2. blok çalıştırılır ve ekrana “78 puanının beşlik sistemdeki karşılığı 4 dir” yazılır. Eğer not 55 olsaydı 85 ve 70 den küçük olduğundan ilk 2 blok çalıştırılmayacak 3. blok çalıştırılarak ekrana “55 puanının beşlik sistemdeki karşılığı 3 dir” mesajı yazılacaktı. 50 ve 30 notları için de benzer adınmlar uygulanacaktı. Eğer not 20 olsaydı hiçbir karşılaştırma doğru olamaycaktı dolayısıyla else bloğu çalıştırılacaktı ve ekrana “20 puanının beşlik sistemdeki karşılığı 0 dir” şeklinde mesaj yazılacaktı.

Örnek: Basit hesap makinesi. Girilen işlem numarasına göre yine girilen iki sayıyı bu işleme tabi tutup sunucu gösteren programı yazınız.

Cevap:

izlenecek adımlar

  • kullanıcıya hangi işlemin hangi numara ile kullanacağı bildirilecek ve işlem numarası istenecek
  • işlem numarası alındıktan sonra kullanıcıdan asyılar alınacak
  • belirlenen işlem numarasına göre bu iki sayı işleme sokulacak ve sonuç ekrana yazılacak
print("* Hesap Makinesi *")
print("Hesap makinesinde işlem numaraları aşağıdaki gibidir.")
print("1: Toplama")
print("2: Çıkarma")
print("3: çarpma")
print("4: Bölme")

islem = readline("İşlem numarasını giriniz: ")

# readline ile alınan değerler karakter olduğundan 
# sayısal işlemlere tabi tutamayız bu yüzden önce 
# girilen ifadenin sayıya dönüştürülmesi lazım 
# bunun için as.numeric() fonksiyonu kullanıldı
sayi1 = as.numeric(readline("İlk sayıyı giriniz: "))
sayi2 = as.numeric(readline("İkinci sayıyı giriniz: "))

if(islem == "1"){
    print(paste(sayi1, "+", sayi2, "=", sayi1 + sayi2))
}else if(islem == "2"){
    print(paste(sayi1, "-", sayi2, "=", sayi1 - sayi2))
}else if(islem == "3"){
    print(paste(sayi1, "*", sayi2, "=", sayi1 * sayi2))
}else if(islem == "4"){
    print(paste(sayi1, "/", sayi2, "=", sayi1 / sayi2))
}else{
    "hatalı işlem numarası girildiğinden işlem yapamadık"
}

Örnek: kullanıcının klavyeden girdiği sayının 3 e ve 5 e tam bölünüp bölünmediğini bulu ekrana yazan uygulamayı yazınız.

Cevap:

sayi = as.numeric(readline("Lütfen bir sayı giriniz: "))

if (sayi %% 3 == 0 & sayi %% 5 == 0){
    print("girdiğiniz sayı 3 e ve beşe tam bölünür")
}else{
    print("girdiğiniz sayı 3 e ve beşe tam bölünmez")
}

2.5 Değerlendirme Soruları

Soru 1. Klavyeden alış fiyatı girilen bir meyvenin %20 karla satılmak istendiğinde kaç TL ye satılacağını gösteren programı yazınız.

Soru 2. Yükseklik ve taban uzunluğu klaveden girilen üçgenin alanını hesaplayan ve ekrana yazan programı yazınız

Soru 3. Bir üniversite öğrencisinin 1 vize ve 1 final notu vardır. Dersin geçme şartı ortalamanın 60 ve üzerinde olmasıdır.

Ortalama şu şekilde hesaplanacaktır.

  • vizenin %40’si,
  • Finalin %60’ı

Soru 4. Kullanıcının klavyeden girdiği sayı 0-100 aralığındaysa ekranda “geçerli” değilse “geçersiz” yazan programı yazınız.

2.6 Cevaplar

Cevap 1.

# readline fonksiyonu ile kullanıcıdan veri alındığında
# bu veri karakter sınıfına ait olur 
# sayısal işlemler yapılacağından öncelikle girilen sayıyı
# sayısal olarak dönüştürmeliyiz
fiyat = as.numeric(readline("meyve fiyatını giriniz: "))

# satış fiyatının %20 karlı olması için fiyatın üzerine
# alış fiyatının %20 sini eklemeliyiz
satis = fiyat + fiyat * 0.2

# sonucu ekrana yazdıralım
print(paste("%20 kar ile satış fiyatınız:", satis))

Cevap 2.

# readline fonksiyonu ile kullanıcıdan veri alındığında
# bu veri karakter sınıfına ait olur 
# sayısal işlemler yapılacağından öncelikle girilen sayıları
# sayısal olarak dönüştürmeliyiz
yukseklik = as.numeric(readline("Yükseklik uzunluğunu giriniz:"))
taban = as.numeric(readline("Taban uzunluğunu giriniz:"))

# üçgen alan formülünü uyguluyoruz
alan = yukseklik * taban / 2

# elde edilen sonucu ekrana yazdırıyoruz
print(paste("üçgeninizin alanı: ", alan))

Cevap 3.

# readline fonksiyonu ile kullanıcıdan veri alındığında
# bu veri karakter sınıfına ait olur 
# sayısal işlemler yapılacağından öncelikle girilen sayıları
# sayısal olarak dönüştürmeliyiz
vize = as.numeric(readline("Vize puanınızı giriniz:"))
final = as.numeric(readline("Final puanınızı giriniz:"))

# belirtilen ortalama hesabını uyguluyoruz
ortalama = vize * .4 + final * .6


if (ortalama >= 60){
    print(paste(ortalama, "ortalama ile geçtiniz."))
}else{
    print(paste(ortalama, "ortalama ile kaldınız."))
}

Cevap 4.

# readline fonksiyonu ile kullanıcıdan veri alındığında
# bu veri karakter sınıfına ait olur 
# sayısal işlemler yapılacağından öncelikle girilen sayıları sayısal
# olarak dönüştürmeliyiz
sayi = as.numeric(readline("bir sayı giriniz:"))

if (0 <= sayi & sayi <= 100){
    print("girilen sayı [0, 100] aralığındadır")
}else{
    print("girilen sayı [0, 100] aralığında değildir")
}