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.

Ş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
= 15
.ali paste(".ali deşkeninin değeri", .ali)
## [1] ".ali deşkeninin değeri 15"
# her hangi bir harf ile başlayabilir
= 3
top.sayisi 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
<- "merhaba"
degisken1 = "dünya"
degisken2 = 180
ucgen.ic.acisi = 180
ucgenIcAcisi
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
= 4
sayi 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
= 5
sayi 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
= 4
sayi 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
= 5
sayi 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.
= 78
not if(not >= 85){
= 5
beslik else if(not >= 70){
}= 4
beslik else if(not >= 55){
}= 3
beslik else if(not >= 45){
}= 2
beslik else if(not >= 25){
}= 1
beslik else{
}= 0
beslik
}
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")
= readline("İşlem numarasını giriniz: ")
islem
# 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ı
= as.numeric(readline("İlk sayıyı giriniz: "))
sayi1 = as.numeric(readline("İkinci sayıyı giriniz: "))
sayi2
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:
= as.numeric(readline("Lütfen bir sayı giriniz: "))
sayi
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
= as.numeric(readline("meyve fiyatını giriniz: "))
fiyat
# satış fiyatının %20 karlı olması için fiyatın üzerine
# alış fiyatının %20 sini eklemeliyiz
= fiyat + fiyat * 0.2
satis
# 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
= as.numeric(readline("Yükseklik uzunluğunu giriniz:"))
yukseklik = as.numeric(readline("Taban uzunluğunu giriniz:"))
taban
# üçgen alan formülünü uyguluyoruz
= yukseklik * taban / 2
alan
# 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
= as.numeric(readline("Vize puanınızı giriniz:"))
vize = as.numeric(readline("Final puanınızı giriniz:"))
final
# belirtilen ortalama hesabını uyguluyoruz
= vize * .4 + final * .6
ortalama
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
= as.numeric(readline("bir sayı giriniz:"))
sayi
if (0 <= sayi & sayi <= 100){
print("girilen sayı [0, 100] aralığındadır")
else{
}print("girilen sayı [0, 100] aralığında değildir")
}