4 İş akışı: stil
İyi bir kodlama stili, doğru noktalama işaretleri gibidir: onsuz da idare edebilirsiniz amakesinlikleokumayıçokkolaylaştırır. Çok yeni bir programcı olsanız bile, kod stiliniz üzerinde çalışmak iyi bir fikirdir. Tutarlı bir stil kullanmak, başkalarının (gelecekteki siz de dahil!) çalışmanızı okumasını kolaylaştırır ve özellikle birinden yardım almanız gerektiğinde önem kazanır. Bu bölüm, bu kitap boyunca kullanılan tidyverse stil rehberinin en önemli noktalarını tanıtacaktır.
Kodunuzu biçimlendirmek başlangıçta biraz sıkıcı gelebilir; ancak pratik yaptıkça kısa sürede doğal bir alışkanlığa dönüşür. Ayrıca Lorenz Walthert’in styler paketi gibi, mevcut kodu hızla yeniden biçimlendiren harika araçlar vardır. Paketi install.packages("styler") ile kurduktan sonra kullanmanın kolay yollarından biri RStudio’nun Command Palette (Komut Paleti) özelliğidir. Command Palette, RStudio’da yerleşik bütün komutlara ve paketlerin sağladığı pek çok eklentiye erişmenizi sağlar. Cmd/Ctrl + Shift + P tuşlarına basarak paleti açın, ardından styler’ın sunduğu bütün kısayolları görmek için styler yazın. Şekil 4.1 sonuçları gösterir.
Bu bölümdeki kod örnekleri için tidyverse ve nycflights13 paketlerini kullanacağız.
4.1 Adlar
İsimler hakkında Bölüm 2.3 bölümünde kısaca konuştuk. Değişken adlarının (<- ile ve mutate() ile oluşturulanların) yalnızca küçük harfler, sayılar ve _ kullanması gerektiğini unutmayın. Bir isim içinde kelimeleri ayırmak için _ kullanın.
Genel bir kural olarak hızlı yazılan kısa adlar yerine, anlaşılması kolay, uzun ve açıklayıcı adları tercih etmek daha iyidir. Kısa adlar kod yazarken çok az zaman kazandırır; özellikle otomatik tamamlama zaten yazmayı hızlandırır. Buna karşılık eski bir koda döndüğünüzde anlaşılması güç bir kısaltmayı çözmek epey zaman alabilir.
Birbiriyle ilişkili çok sayıda nesneye ad verirken olabildiğince tutarlı davranın. Daha önce benimsediğiniz bir kuralı unutunca tutarsızlıklar kolayca ortaya çıkabilir; bu yüzden geriye dönüp bazı şeyleri yeniden adlandırmanız gerekirse üzülmeyin. Genel olarak aynı temanın çeşitlemeleri olan çok sayıda değişkeniniz varsa ortak bir son ek yerine ortak bir ön ek kullanmak daha iyidir; çünkü otomatik tamamlama en iyi değişken adının başlangıcında çalışır.
4.2 Boşluklar
^ hariç matematiksel operatörlerin (yani +, -, ==, <, …) her iki tarafına ve atama operatörünün (<-) etrafına boşluk koyun.
# Tercih edin
z <- (a + b)^2 / d
# Kaçının
z<-( a + b ) ^ 2/dNormal fonksiyon çağrılarında fonksiyon adıyla açma parantezi arasına veya parantezlerin içine boşluk koymayın. Türkçe yazımda olduğu gibi virgülden sonra her zaman bir boşluk bırakın.
Hizalamayı iyileştiriyorsa fazladan boşluk eklemek sorun değildir. Örneğin, mutate() içinde birden fazla değişken oluşturuyorsanız, tüm =’ların hizalanması için boşluk eklemek isteyebilirsiniz.1 Bu, kodu göz gezdirerek okumayı kolaylaştırır.
4.3 Pipe operatörü
|>’ın önünde her zaman bir boşluk olmalı ve genellikle bir satırdaki son şey olmalıdır. Bu düzen; yeni adımlar eklemeyi, var olan adımları yeniden sıralamayı, bir adımdaki öğeleri değiştirmeyi ve soldaki fiillere göz gezdirerek kodu kuşbakışı görmeyi kolaylaştırır.
Pipe ile aktardığınız fonksiyonun adlandırılmış argümanları varsa (mutate() veya summarize() gibi), her argümanı ayrı bir satıra yazın. Fonksiyonun adlandırılmış argümanları yoksa (select() veya filter() gibi), sığmadığı sürece her şeyi tek bir satırda tutun; sığmıyorsa her argümanı kendi satırına koymalısınız.
İşlem hattının ilk adımından sonra her satırı iki boşlukla girintileyin. RStudio, bir |>’ı takip eden satır sonundan sonra boşlukları sizin için otomatik olarak ekleyecektir. Her argümanı kendi satırına koyuyorsanız, fazladan iki boşlukla daha girintileyin. )’nin kendi satırında olduğundan ve fonksiyon adının yatay konumuyla eşleşecek şekilde girintisiz olduğundan emin olun.
# Tercih edin
flights |>
group_by(tailnum) |>
summarize(
delay = mean(arr_delay, na.rm = TRUE),
n = n()
)
# Kaçının
flights|>
group_by(tailnum) |>
summarize(
delay = mean(arr_delay, na.rm = TRUE),
n = n()
)
# Kaçının
flights|>
group_by(tailnum) |>
summarize(
delay = mean(arr_delay, na.rm = TRUE),
n = n()
)İşlem hattınız tek bir satıra rahatça sığıyorsa bu kuralların bazılarını es geçebilirsiniz. Ancak ortak deneyimimize göre kısa kod parçaları zamanla çoğunlukla uzar. Bu nedenle ihtiyaç duyacağınız dikey boşluğu baştan ayırmak uzun vadede zaman kazandırır.
Son olarak, örneğin 10-15 satırı aşan çok uzun işlem hatları yazmaktan kaçının. Bunları daha küçük alt görevlere bölmeye ve her göreve açıklayıcı bir ad vermeye çalışın. Bu adlar, okuyucunun neler olduğunu anlamasına yardımcı olur ve ara sonuçların beklendiği gibi olup olmadığını denetlemeyi kolaylaştırır. Örneğin pivot veya özetleme işleminden sonra verinin yapısını kökten değiştirdiğinizde, ara sonuca açıklayıcı bir ad verin. İlk seferde doğru yapacağınızı beklemeyin! Bu da uygun biçimde adlandırılabilecek ara durumlar varsa uzun işlem hatlarını bölmek anlamına gelir.
4.4 ggplot2
Pipe operatörüne uygulanan temel kurallar ggplot2 için de geçerlidir; + işaretini |> gibi ele alın.
Yine, bir fonksiyonun tüm argümanlarını tek bir satıra sığdıramıyorsanız, her argümanı kendi satırına koyun:
flights |>
group_by(dest) |>
summarize(
distance = mean(distance),
speed = mean(distance / air_time, na.rm = TRUE)
) |>
ggplot(aes(x = distance, y = speed)) +
geom_smooth(
method = "loess",
span = 0.5,
se = FALSE,
color = "white",
linewidth = 4
) +
geom_point()|>’dan +’a geçişe dikkat edin. Bu geçişin gerekli olmamasını dilerdik; ama ne yazık ki ggplot2, pipe keşfedilmeden önce yazılmıştı.
4.5 Bölüm yorumları
Scriptleriniz uzadıkça dosyanızı yönetilebilir parçalara ayırmak için bölüm yorumlarını kullanabilirsiniz:
# Veriyi yükle --------------------------------------
# Veriyi çiz --------------------------------------RStudio, bu başlıkları oluşturmak için bir klavye kısayolu sağlar (Cmd/Ctrl + Shift + R) ve Şekil 4.2’ta gösterildiği gibi, bunları editörün sol alt köşesindeki kod gezinme açılır menüsünde gösterir.
4.6 Alıştırmalar
-
Aşağıdaki işlem hatlarını yukarıdaki yönergeleri izleyerek yeniden biçimlendirin.
flights|>filter(dest=="IAH")|>group_by(year,month,day)|>summarize(n=n(), delay=mean(arr_delay,na.rm=TRUE))|>filter(n>10) flights|>filter(carrier=="UA",dest%in%c("IAH","HOU"),sched_dep_time> 0900,sched_arr_time<2000)|>group_by(flight)|>summarize(delay=mean( arr_delay,na.rm=TRUE),cancelled=sum(is.na(arr_delay)),n=n())|>filter(n>10)
4.7 Özet
Bu bölümde, kod stilinin en önemli ilkelerini öğrendiniz. Bunlar başlangıçta keyfi bir kurallar dizisi gibi hissettirebilir (çünkü öyleler!); ama zamanla, daha fazla kod yazdıkça ve daha fazla kişiyle kod paylaştıkça, tutarlı bir stilin ne kadar önemli olduğunu göreceksiniz. styler paketini de unutmayın: kötü biçimlendirilmiş kodun kalitesini hızla artırmanın harika bir yoludur.
Bir sonraki bölümde, veri bilimi araçlarına geri dönerek düzenli veri (tidy data) hakkında bilgi edineceğiz. Düzenli veri, tidyverse boyunca kullanılan, veri çerçevelerinizi düzenlemenin tutarlı bir yoludur. Bu tutarlılık hayatınızı kolaylaştırır; çünkü düzenli veriniz olduğunda, tidyverse fonksiyonlarının büyük çoğunluğuyla sorunsuzca çalışır. Elbette, hayat hiçbir zaman kolay değildir ve gerçek hayatta karşılaşacağınız veri kümelerinin çoğu henüz düzenli olmayacaktır. Bu yüzden size, düzensiz verinizi düzenlemek için tidyr paketini nasıl kullanacağınızı da öğreteceğiz.
dep_time,HMMveyaHHMMbiçiminde olduğundan, saati almak için tam sayı bölmesini (%/%), dakikayı almak için ise kalanı (modulo olarak da bilinir,%%) kullanırız.↩︎