2  İş akışı: temeller

Artık R kodu çalıştırma konusunda biraz deneyim kazandınız. Size pek ayrıntı vermedik ama belli ki temel noktaları çözdünüz; yoksa hayal kırıklığı içinde bu kitabı çoktan bir kenara atmış olurdunuz! R, noktalama işaretleri konusunda çok titiz olduğu ve tek bir karakterin yanlış yerde bulunması bile hata vermesine yettiği için R’da programlamaya başlarken zorlanmak doğaldır. Bunun herkesin başına gelen ve zamanla geçen bir süreç olduğunu bilmek içinizi biraz rahatlatabilir; bu süreci aşmanın tek yolu denemeyi sürdürmektir.

Devam etmeden önce, R kodu çalıştırma konusunda sağlam bir temele sahip olduğunuzdan ve RStudio’nun en yararlı özelliklerinden bazılarını bildiğinizden emin olalım.

2.1 Kodlamanın temelleri

Bir an önce grafik çizmeye başlamanız için şimdiye kadar değinmediğimiz bazı temel noktaları gözden geçirelim. R’ı basit matematiksel hesaplamalar yapmak için kullanabilirsiniz:

1 / 200 * 30
#> [1] 0.15
(59 + 73 + 2) / 3
#> [1] 44.66667
sin(pi / 2)
#> [1] 1

Atama operatörü <- ile yeni nesneler oluşturabilirsiniz:

x <- 3 * 4

x’in değerinin ekrana yazdırılmadığına, yalnızca saklandığına dikkat edin. Değeri görmek için konsola x yazabilirsiniz.

Adını İngilizce combine (birleştirmek) sözcüğünden alan c() fonksiyonuyla birden fazla elemanı bir vektörde birleştirebilirsiniz:

primes <- c(2, 3, 5, 7, 11, 13)

Vektörler üzerindeki temel aritmetik işlemler de vektörün her elemanına uygulanır:

primes * 2
#> [1]  4  6 10 14 22 26
primes - 1
#> [1]  1  2  4  6 10 12

Nesne oluşturan bütün R ifadeleri, yani atama ifadeleri, aynı yapıdadır:

object_name <- value

Bu kodu okurken içinizden “nesne adı değeri alır” deyin.

Çok sayıda atama yapacaksınız; <- yazmaksa zahmetlidir. RStudio’nun klavye kısayoluyla zaman kazanabilirsiniz: Alt + - (eksi işareti). RStudio’nun <- operatörünün iki yanına otomatik olarak boşluk eklediğine dikkat edin; bu, kod biçimlendirmeyle ilgili iyi bir uygulamadır. Kod okumak en iyi gününüzde bile yorucu olabilir; bu yüzden gözlerinizebirmolaverin ve boşluk kullanın.

2.2 Yorumlar

R, bir satırda #’den sonraki her metni yok sayar. Bu sayede, R’ın yok saydığı ancak insanların okuyabildiği metinler olan yorumlar yazabilirsiniz. Örneklerde zaman zaman kodda neler olduğunu açıklayan yorumlara yer vereceğiz.

Yorumlar, ardından gelen kodun ne yaptığını kısaca açıklamak için yararlı olabilir.

# asal sayılardan oluşan bir vektör oluştur
primes <- c(2, 3, 5, 7, 11, 13)

# asal sayıları 2 ile çarp
primes * 2
#> [1]  4  6 10 14 22 26

Bunun gibi kısa kod parçalarında her satıra ayrı bir yorum yazmak gerekmeyebilir. Ancak yazdığınız kod karmaşıklaştıkça yorumlar, hem sizin hem de birlikte çalıştığınız kişilerin kodda ne yapıldığını anlamak için harcayacağı zamandan büyük ölçüde tasarruf etmesini sağlayabilir.

Yorumları, kodunuzun ne yaptığını ya da nasıl çalıştığını değil, neden o şekilde yazıldığını açıklamak için kullanın. Biraz zahmetli olsa bile kodu dikkatlice okuyarak ne yaptığını ve nasıl çalıştığını her zaman anlayabilirsiniz. Yorumlarda her adımı açıklayıp daha sonra kodu değiştirirseniz yorumları da güncellemeyi unutmamanız gerekir; yoksa ileride koda döndüğünüzde yorumlar kafa karıştırır.

Bir şeyin neden yapıldığını anlamak ise çok daha zordur, hatta bazen olanaksızdır. Örneğin geom_smooth() fonksiyonunun, eğrinin ne kadar pürüzsüz olacağını belirleyen span adlı bir argümanı vardır; daha büyük değerler daha pürüzsüz bir eğri oluşturur. span değerini varsayılan değer olan 0,75’ten 0,9’a değiştirdiğinizi varsayalım. Kodu ileride okuyan biri değişikliğin ne olduğunu kolayca anlayabilir ama düşüncenizi bir yorumla kaydetmediğiniz sürece varsayılan değeri neden değiştirdiğinizi anlayamaz.

Veri analizi kodlarında yorumları genel yaklaşımınızı açıklamak ve karşılaştığınız önemli içgörüleri kaydetmek için kullanın. Bu bilgileri yalnızca koda bakarak sonradan yeniden elde edemezsiniz.

2.3 Bir isimde ne var?

Nesne adları bir harfle başlamalı ve yalnızca harfler, sayılar, _ ve . içerebilir. Nesne adlarınızın açıklayıcı olması için birden fazla sözcükten oluşan adlara yönelik bir yazım kuralı benimsemeniz gerekir. Küçük harfli sözcükleri _ ile ayıran snake_case yazımını öneriyoruz.

i_use_snake_case
otherPeopleUseCamelCase
some.people.use.periods
And_aFew.People_RENOUNCEconvention

Bölüm 4 bölümünde kod stilini ele alırken adlandırma konusuna yeniden döneceğiz.

Bir nesnenin adını yazarak onu inceleyebilirsiniz:

x
#> [1] 12

Başka bir atama yapın:

this_is_a_really_long_name <- 2.5

Bu nesneyi incelemek için RStudio’nun kod tamamlama özelliğini deneyin: this yazıp Tab tuşuna basın, benzersiz bir önek elde edene kadar karakter ekleyin ve ardından Enter tuşuna basın.

Bir hata yaptığınızı ve this_is_a_really_long_name nesnesinin değerinin 2,5 değil 3,5 olması gerektiğini varsayalım. Bunu düzeltmenize yardımcı olacak başka bir klavye kısayolu kullanabilirsiniz. Örneğin son yazdığınız komutu geri getirip düzenlemek için ↑ tuşuna basabilirsiniz. Başka bir seçenek olarak this yazıp bu harflerle başlayan bütün eski komutlarınızı listelemek için Cmd/Ctrl + ↑ tuşlarına basabilirsiniz. Ok tuşlarıyla listede gezinin, ardından komutu yeniden konsola getirmek için Enter tuşuna basın. 2,5 değerini 3,5 olarak değiştirip kodu yeniden çalıştırın.

Bir atama daha yapın:

r_rocks <- 2^3

Onu incelemeyi deneyelim:

r_rock
#> Error: object 'r_rock' not found
R_rocks
#> Error: object 'R_rocks' not found

Bu örnek, sizinle R arasındaki örtük sözleşmeyi gösterir: R sıkıcı hesaplamaları sizin için yapar ama karşılığında ona verdiğiniz talimatların eksiksiz ve kesin olması gerekir. Aksi takdirde aradığınız nesnenin bulunamadığını bildiren bir hata almanız çok olasıdır. Yazım hataları önemlidir; R aklınızı okuyup “r_rock yazdı ama herhâlde r_rocks demek istedi” diyemez. Büyük ve küçük harfler de önemlidir; aynı şekilde R, R_rocks yazdığınızda aslında r_rocks demek istediğinizi anlayamaz.

2.4 Fonksiyon çağırma

R, aşağıdaki gibi çağrılan çok sayıda yerleşik fonksiyona sahiptir:

function_name(argument1 = value1, argument2 = value2, ...)

Düzenli sayı dizileri oluşturan seq() fonksiyonunu kullanmayı deneyelim ve bu sırada RStudio’nun birkaç yararlı özelliğini daha öğrenelim. (seq adı, İngilizce sequence, yani “dizi” sözcüğünün kısaltmasıdır.) se yazıp Tab tuşuna basın. Açılan pencere olası tamamlama seçeneklerini gösterir. Seçenekleri teke indirmek için bir karakter daha (q) yazın veya ↑/↓ tuşlarıyla seq() fonksiyonunu seçin. Fonksiyonun argümanlarını ve ne işe yaradığını hatırlatan kayan bilgi kutusuna dikkat edin. Daha fazla yardım için F1 tuşuna basarak sağ alt paneldeki Help sekmesinde bütün ayrıntıları görebilirsiniz.

İstediğiniz fonksiyonu seçtikten sonra Tab tuşuna yeniden basın. RStudio birbiriyle eşleşen açma (() ve kapama ()) parantezlerini sizin için ekler. İlk argümanın adı olan from’u yazıp değerini 1 olarak ayarlayın. Ardından ikinci argümanın adı olan to’yu yazıp değerini 10 olarak ayarlayın. Son olarak Enter tuşuna basın.

seq(from = 1, to = 10)
#>  [1]  1  2  3  4  5  6  7  8  9 10

Fonksiyon çağrılarında ilk birkaç argümanın adını genellikle belirtmeyiz; dolayısıyla bu kodu şöyle yeniden yazabiliriz:

seq(1, 10)
#>  [1]  1  2  3  4  5  6  7  8  9 10

Aşağıdaki kodu yazın ve RStudio’nun eşleşen tırnak işaretlerini eklerken de benzer biçimde yardımcı olduğuna dikkat edin:

x <- "hello world"

Tırnak işaretleri ve parantezler her zaman çift halinde gelmelidir. RStudio size yardımcı olmak için elinden geleni yapar ama yine de eşleşmeyen işaretlerle karşılaşabilirsiniz. Böyle bir durumda R, devam karakteri olan + işaretini gösterir:

> x <- "hello
+

+, R’ın daha fazla girdi beklediğini, yani yazmayı bitirdiğinizi düşünmediğini gösterir. Bu genellikle bir " ya da ) işaretini unuttuğunuz anlamına gelir. Eksik işareti ekleyebilir veya ifadeyi iptal edip yeniden denemek için Esc tuşuna basabilirsiniz.

Sağ üst paneldeki Environment sekmesinin oluşturduğunuz bütün nesneleri gösterdiğine dikkat edin:

RStudio'nun Global Environment bölümünde r_rocks, this_is_a_really_long_name, x ve y'yi gösteren Environment sekmesi.

2.5 Alıştırmalar

  1. Bu kod neden çalışmıyor?

    my_variable <- 10
    my_varıable
    #> Error:
    #> ! object 'my_varıable' not found

    Dikkatlice bakın! (Bu, anlamsız bir alıştırma gibi görünebilir ama zihninizi en küçük farkı bile görecek şekilde eğitmek programlama yaparken işinize yarayacaktır.)

  2. Aşağıdaki R komutlarının her birini doğru çalışacak şekilde düzeltin:

    libary(todyverse)
    
    ggplot(dTA = mpg) + 
      geom_point(maping = aes(x = displ y = hwy)) +
      geom_smooth(method = "lm)
  3. Option + Shift + K / Alt + Shift + K tuşlarına basın. Ne olur? Menüleri kullanarak aynı yere nasıl ulaşabilirsiniz?

  4. Bölüm 1.6 bölümündeki bir alıştırmayı tekrar ele alalım. Aşağıdaki kod satırlarını çalıştırın. İki grafikten hangisi mpg-plot.png olarak kaydedilir? Neden?

    my_bar_plot <- ggplot(mpg, aes(x = class)) +
      geom_bar()
    my_scatter_plot <- ggplot(mpg, aes(x = cty, y = hwy)) +
      geom_point()
    ggsave(filename = "mpg-plot.png", plot = my_bar_plot)

2.6 Özet

Artık R kodunun nasıl çalıştığı hakkında biraz daha bilgi sahibisiniz. Ayrıca ileride kodunuza döndüğünüzde onu anlamanızı kolaylaştıracak birkaç ipucu öğrendiniz. Bir sonraki bölümde veri bilimi yolculuğumuza dplyr ile devam edeceğiz. tidyverse paketlerinden biri olan dplyr; önemli değişkenleri seçmek, ilgilendiğiniz satırları süzmek ve özet istatistikler hesaplamak gibi veri dönüştürme işlemlerinde size yardımcı olur.