R'de Sınıf
Sınıf, bir nesne oluşturmayı sağlayan ve üye değişkenleri ile özniteliklerini içeren bir plandır.
Önceki bölümde tartışıldığı gibi, R'de S3 ve S4 olmak üzere iki sınıf türü vardır.
S3 Sınıfı
Bu sınıflar, fonksiyonları genel (generic) ve yöntemlere (methods) ayırarak aşırı yüklemeye yardımcı olur.
fonksiyonlar = genel + yöntemler
S3; C#, Java vb. diğer programlama dillerinden oldukça farklıdır. Uygulaması çok kolaydır, yalnızca ilk argümanı kullanarak göndermeyi (dispatch) yapar. Bu nedenle programcı açısından çok fazla bilgi gerektirmez.
S3, generic.nesneSınıfı biçiminde katı bir adlandırma kuralı tanımlayarak çalışır.
generic.class
Yöntemlerin argümanları, genelin argümanlarını içermeli ve yöntem bir ...arg içermelidir.
S3 Sınıfı Oluşturma ve Örneği
Aşağıdaki örnekte bir S3 sınıfının nasıl oluşturulacağı gösterilecektir; bileşenlerin uygun sınıf adıyla birlikte geçirildiği bir liste oluşturulmakta ve ardından sonuç yazdırılmaktadır.
Aşağıdaki örnekte 'studentBio', 'student_name', 'student_age' ve 'student_contact' bileşenlerinin liste olarak verildiği bir liste içerir. Sınıfın adı 'Student Info'dur ve 'studentBio' aşağıda değerleri gösterilen yeni oluşturulan sınıftır.
studentBio <- list(studentName = "Harry Potter", studentAge = 19, studentContact="London")
class(studentBio) <- "StudentInfo"
studentBio
$studentName
[1] "Harry Potter"
$studentAge
[1] 19
$studentContact
[1] "London"
attr(,"class")
[1] "StudentInfo"
Yukarıdaki kod aşağıdaki çıktıyı verir:
$studentName
"Harry Potter"
$studentAge
19
$studentContact
"London"
attr(,"class")
"StudentInfo"
R'de fonksiyon yazmaktan emin değilseniz, R'de Fonksiyon Kullanımı Rehberi yazısını okuyun!
S3'te Kendi Genel Yönteminizi Oluşturma
Aşağıdaki kodu kullanarak kendi genel fonksiyonunuzu uygulayacaksınız.
Aşağıdaki kod, 'contact' adlı genel fonksiyonu gösterir; nesne ile birlikte geçirilen fonksiyon buna atanır. Ayrıca, 'UseMethod' ile 'contact' adlı genel fonksiyon kullanılır; burada, geçirilen argümanlara göre sonucun değiştiği süreç olan yöntem 'dispatching' gerçekleşir.
contact <- function(object) {
UseMethod("contact")
}
Önceden oluşturduğunuz 'StudentInfo' adlı belirli sınıf için bir yöntem yazalım. 'contact' yöntemi, sınıf adı 'StudentInfo' ile nokta gösterimi kullanılarak yazılır; fonksiyon gövdesinde '$' kullanılarak 'studentContact' özniteliğine erişilir.
contact.StudentInfo <- function(object) {
cat("Your contact is", object$studentContact, "\n")
}
contact(studentBio)
Your contact is London
Yukarıdaki kodda, fonksiyona argüman olarak geçirilen nesnenin 'studentContact' özniteliğine erişmek için object$studentContact kullanılır ve aşağıdaki çıktıyı üretir.
Your contact is London
S4 Sınıfı
S4 Sınıfı daha katı, geleneksel ve Nesne Yönelimli kavramlara daha yakındır. Sınıflar, S4'ün biçimsel sınıf tanımlarıyla temsil edilir. Daha spesifik olarak, S4'te yöntemler ve geneller için setter ve getter fonksiyonları vardır. S3 sınıfıyla karşılaştırıldığında, S4 çoklu gönderimi (multiple dispatch) kolaylaştırabilir.
Yukarıda tartışılan R sınıflarını oluşturarak görelim ve bir örnekle ele alalım.
Bir S4 sınıfı setClass fonksiyonu kullanılarak tanımlanır.
setClass()
S4 Sınıfı Oluşturma ve Örneği
Daha önce belirtildiği gibi, S4 sınıfı setClass() yöntemiyle tanımlanır. S4 sınıfını oluşturmak ve tanımlamak için setClass() yöntemini kullanacaksınız. Verilerin tutarlı olduğunu doğrulamak (validasyon) ve varsayılan değerleri ayarlamak (paradigma) için bir yardımcı yordam kullanacağız.
Sınıfı ve slotlarını tanımlamak için kod aşağıdadır:
Aşağıdakiler, 'prototype' olarak da adlandırılan bir sınıfı tanımlamak için kullanılır; slotların tanımlandığı bu yapıda sınıf adı 'employee', name karakter, id sayısal ve contact karakterdir.
setClass("employee", slots=list(name="character", id="numeric", contact="character"))
Aşağıdaki kod, S4'ün belirli örneklerini veya nesnelerini oluşturabilir.
'new' kullanılarak, içine sınıf adı olarak 'employee' yazılıp name, id ve contact slotları değerlerle doldurularak bir nesne oluşturalım.
obj <- new("employee",name="Steven", id=1002, contact="West Avenue")
obj
An object of class "employee"
Slot "name":
[1] "Steven"
Slot "id":
[1] 1002
Slot "contact":
[1] "West Avenue"
An object of class "employee"
Slot "name":
"Steven"
Slot "id":
1002
Slot "contact":
"West Avenue"
Yukarıdaki çıktı, oluşturulan nesnenin "employee" sınıfından olduğunu; "name" slotunun "Steven", "id" slotunun 1002 ve "contact" slotunun "West Avenue" değerine sahip olduğunu gösterir.
Fonksiyon ve komutlar
Bir nesnenin S4 nesnesi olup olmadığını kontrol etmek için aşağıdaki iki komut kullanılabilir:
'is.object(obj)' komutu, bir değişkenin veya örneğin bir nesneye referans verip vermediğini kontrol eder.
is.object(obj)
TRUE
Yukarıdaki kod şu çıktıyı verir:
TRUE
'is.S4(obj)' komutu, bir değişkenin veya örneğin bir S4 nesnesi olup olmadığını kontrol eder.
isS4(obj)
TRUE
Yukarıdaki kod şu çıktıyı verir:
TRUE
Slot değerine erişme ve değiştirme
Slota erişme
Slot, "$" yerine "@" kullanılarak erişilir.
'obj@name', nesne adı ile slot adını kullanarak 'Steven' adına erişmek için kullanılır; benzer şekilde 'obj@id' için de yapılır.
obj@name
obj@id
'Steven'
1002
Yukarıdaki kod şu çıktıyı verir:
'Steven'
1002
Slotu değiştirme
'obj@contact' slotuna "North Avenue" gibi yeni bir değer atamak için atama operatörünü ("<-") kullanarak slot değerini değiştirelim.
obj@contact <- "North Avenue"
obj
An object of class "employee"
Slot "name":
[1] "Steven"
Slot "id":
[1] 1002
Slot "contact":
[1] "North Avenue"
Yukarıdaki kod şu çıktıyı verir:
An object of class "employee"
Slot "name":
"Steven"
Slot "id":
1002
Slot "contact":
"North Avenue"
Yukarıdaki çıktı, "contact" slotunun değerinin önce "West Avenue" iken "North Avenue" olarak değiştiğini gösterir.
Alternatif olarak, değeri değiştirmek için 'slot()' fonksiyonunu kullanma seçeneği vardır.
'slot(obj, "id")', "id" slotu değerinin 1004 olarak değiştirilmesini belirtir ve sonuç 'obj' ile yazdırılır.
slot(obj,"id") <- 1004
obj
An object of class "employee"
Slot "name":
[1] "Steven"
Slot "id":
[1] 1004
Slot "contact":
[1] "North Avenue"
An object of class "employee"
Slot "name":
"Steven"
Slot "id":
1004
Slot "contact":
"North Avenue"
Yukarıdaki çıktı, "id" slotunun değerinin 1002 iken 1004 olarak değiştiğini gösterir.
S4'te Kendi Genel Yönteminizi Oluşturma
İhtiyaçlarımıza göre çıktı yazdırmaya yardımcı olacak bir fonksiyon oluşturalım; burada 'setMethod()' ve 'show()' adlı genel fonksiyon kullanılır. Ayrıca tüm slot değerlerine '@' ile erişilir ve adları yazdırılır. Son olarak, çıktı 'obj' ile elde edilir.
setMethod("show",
"employee",
function(object) {
cat("Name:",object@name, "\n")
cat("Id:",object@id, "\n")
cat("Contact:", object@contact, "\n")
}
)
obj
Name: Steven
Id: 1004
Contact: North Avenue
Name: Steven
Id: 1004
Contact: North Avenue
Yukarıdaki çıktı, sonuçların Slot adlarıyla birlikte ilgili Slot değerleri şeklinde yazdırıldığını gösterir.
Tebrikler
Tebrikler, bu eğitimin sonuna ulaştınız!
Bu eğitimde, R'nin nesneleriyle birlikte Nesne Yönelimli Programlama (OOP), S3 ve S4 gibi farklı sınıflar, bunların nasıl oluşturulduğu, genel fonksiyonlarının örneklerle nasıl yazıldığı ve daha fazlasını öğrendiniz.
R hakkında daha fazla bilgi edinmek isterseniz, DataCamp'in şu kurslarına göz atın:

Nesne Yönelimli Programlama (OOP), yazılımı fonksiyonlar yerine veri ya da nesneler etrafında tasarlamak için farklı yöntemlerin kullanıldığı bir programlama paradigmasıdır. Bir yöntem, OOP bağlamında bahsedilen bir fonksiyondur. İşlemenin tamamı nesneler ve alanlar etrafında döndüğü için nesne yönelimlidir. Her nesnenin farklı öznitelikleri ve davranışları vardır.
Nesne Yönelimli programlamada, programın tamamı, yürütmeyi daha hızlı kavramak için farklı sınıflara bölünebilir. R işlevsel bir programlama dilidir ve OOP büyük sistem sorunlarını yönetmeye yardımcı olur. OOP genellikle GUI uygulamalarını, çoğunlukla da web uygulamalarını yönetmek için kullanılır. Nesne Yönelimli Programlama, veri analizi için araçlar geliştirmede iyidir; ancak verinin bizzat analizi için uygun değildir.
OOP Sistemleri
Aşağıda açıklanan başlıca iki OOP sistemi vardır:
Not: Bu sınıflar ilerleyen bölümde ayrıntılı olarak ele alınacaktır.
R'de Nesneler
Nesneler, sınıfın örnekleridir. Ayrıca R'de her şey bir nesnedir; daha fazla bilgi için R'de veri türleri sayfasına bakın. Sınıf, attributes, dimnames, names vb. gibi özniteliklere de sahip olabilirler.
Örneğin, nesnelere
<-ile bir değer atanır; aşağıdaki kod parçasında 'a1' ve 'a2' sayısal değer atanan değişkenlerdir.Bir nesneye bir sayı kümesi atanabilir; burada 'a3' farklı sayılardan oluşan bir vektör içeren nesnedir.
Burada c, 10, 20, 30 sayılarını bir vektöre koyar.
Öğrenci gibi bir gerçek hayat örneği ele alalım: adı, yaşı, sınıfı ve cinsiyeti olan bir öğrenci; öğretmenin ise adı, yaşı ve cinsiyeti vardır.
Yukarıdaki kod aşağıdaki çıktıyı verir:
Yukarıdaki kodda farklı türde nesnelerin olduğu bir örnek görüyorsunuz. 'student' ve 'teacher' nesneleri (değişken de denir) 'character' ve 'double' türlerini tutar.