Ana içeriğe geç

R'de Nesneler ve Sınıflar

Nesne Yönelimli Programlama (OOP), R'nin nesneleri, S3 ve S4 gibi farklı sınıflar, bunların oluşturulması, örnek genel fonksiyonları ve daha fazlası hakkında bilgi edinin.
· 9 dk. oku

Yapay Zeka ile Keşfedin

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:

  • S3 Sınıfları: Fonksiyonları aşırı yüklemenizi sağlar.
  • S4 Sınıfları: Programı hata ayıklamak oldukça zor olduğundan veriyi sınırlandırmanıza olanak tanı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.

a1 <- 10
a2 <- 20

Bir nesneye bir sayı kümesi atanabilir; burada 'a3' farklı sayılardan oluşan bir vektör içeren nesnedir.

a3 <- c(10,20,30)

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.

st_name <- "andrew"
st_age <- 16
st_class <- 10
st_gender <- "male"

t_name <- "angelina"
t_age <- 26
t_gender <- "female"

student <- c(st_name, st_age, st_class, st_gender)
teacher <- c(t_name, t_age, t_gender)


print(student)
print(teacher)
[1] "andrew" "16"     "10"     "male"  
[1] "angelina" "26"       "female"   

Yukarıdaki kod aşağıdaki çıktıyı verir:

"andrew" "16" "10" "male"  
"angelina" "26"  "female"

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.

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:

R'de S3 ve R6 ile Nesne Yönelimli Programlama

Konular

İlgili