İşte bir hızlı sayısız ait yıkık güncellenirsiniz R nesne sistemlerine göre "Gelişmiş Ar, 2. baskı" bir web temsilini vardır Hadley Wickham (RStudio Baş Scientist) tarafından (CRC Press, 2019) burada yaklaşık bölümüne dayanarak, Nesne -O Odaklı Programlama .
2015'ten itibaren ilk baskının burada bir web sunumu var , burada OO ile ilgili ilgili bölüm var .
OO sistemlerine yaklaşımlar
Hadley, OO programlamasına yönelik iki farklı yaklaşımı ayırt etmek için aşağıdakileri tanımlar:
İşlevsel OOP : yöntemler (çağrılabilir kod parçaları) genel işlevlere aittir (Java / C # jenerik yöntemlerle karıştırılmamalıdır ). Yöntemleri genel bir arama tablosunda yer alıyormuş gibi düşünün. Çalıştırılacak yöntem, çalışma zamanı sistemi tarafından, işlevin adına ve bu işleve iletilen bir veya daha fazla argümanın türüne (veya nesne sınıfına) göre bulunur (buna "yöntem dağıtımı" denir). Söz dizimi-bilge, yöntem çağrıları sıradan fonksiyon çağrıları gibi görünebilir: myfunc(object, arg1, arg2)
. Bu çağrı, çalışma zamanının çiftle ilişkili yöntemi ("işlevim", typeof (nesne)) veya muhtemelen ("işlevim", typeof (nesne), typeof (arg1), typeof (arg2)) aramasına yol açar.dil destekliyorsa. R'nin S3'ünde, genel işlevin tam adı (işlev adı, sınıf) çiftini verir. Örneğin: mean.Date
Tarihlerin ortalamasını hesaplama yöntemidir. methods("mean")
Fonksiyon adıyla genel yöntemleri listelemeye çalışın mean
. Fonksiyonel OOP yaklaşımı örneğin OO öncüsü Smalltalk , Common Lisp Nesne Sistemi ve Julia'da bulunur . Hadley, "R ile karşılaştırıldığında, Julia'nın uygulamasının tamamen gelişmiş ve son derece performanslı olduğunu " belirtiyor .
Kapsüllenmiş OOP : yöntemler nesnelere veya sınıflara aittir ve yöntem çağrıları genellikle benzer object.method(arg1, arg2)
. Bu, kapsüllenmiş olarak adlandırılır çünkü nesne hem verileri (alanları) hem de davranışı (yöntemleri) kapsamaktadır. Yöntemin, nesneye veya nesnenin sınıf açıklamasına eklenmiş bir arama tablosunda yer aldığını düşünün. Çalışma zamanı yöntemi, yöntem adına ve muhtemelen bir veya daha fazla argümanın türüne göre arar. Bu, C ++, Java, C # gibi "popüler" OO dillerinde bulunan yaklaşımdır.
Her iki durumda da, eğer miras destekleniyorsa (muhtemelen desteklenmektedir), çalışma zamanı, arama arama anahtarı için bir eşleşme bulana kadar sınıf hiyerarşisini yukarı doğru hareket ettirebilir.
Bir R nesnesinin hangi sisteme ait olduğunu bulma
library(sloop) # formerly, "pryr"
otype(mtcars)
#> [1] "S3"
R nesne sistemleri
S3
- Fonksiyonel OOP yaklaşımı.
- Hadley'e göre en önemli sistem.
- En basit, en yaygın. R. tarafından kullanılan ilk OO sistemi
- R tabanı boyunca kullanılan R tabanı ile birlikte gelir.
- Zorunlu garantilerden çok sözleşmelere dayanır.
- Bkz Chambers, John E, ve Trevor J Hastie. 1992. "S.'de İstatistiksel Modeller" Wadsworth & Brooks / Cole Gelişmiş Kitaplar ve Yazılım.
- Ayrıntılar "Gelişmiş Ar, 2. baskı" Burada .
S4
- Fonksiyonel OOP yaklaşımı.
- Hadley'e göre üçüncü en önemli sistem.
- S3'ün yeniden yazılması, bu nedenle S3'e benzer, ancak daha resmi ve daha katıdır: sizi program tasarımı hakkında dikkatlice düşünmeye zorlar. Büyük sistemler oluşturmak için uygundur (örn. Bioconductor projesi).
- Temel "yöntemler" paketinde uygulanır.
- Bakınız: Chambers, John M. 1998. "Verilerle Programlama: S Dili Rehberi." Springer.
- Ayrıntılar "Gelişmiş Ar, 2. baskı" Burada .
RC aka "Referans Sınıfları"
- Kapsüllenmiş OOP yaklaşımı.
- Baz R ile birlikte gelir.
- S4'e göre.
- RC nesneleri, aynı zamanda "değiştirilebilir" olan özel S4 nesneleridir. yani, R'nin olağan değiştirildiğinde kopyala semantiğini kullanmak yerine, yerinde değiştirilebilirler. Değişken durumun mantık yürütmek zor olduğunu ve çirkin hataların kaynağı olduğunu, ancak bazı uygulamalarda daha verimli koda yol açabileceğini unutmayın.
R6,
- Kapsüllenmiş OOP yaklaşımı.
- Hadley'e göre ikinci en önemli sistem.
- Bulunabilir R6 paketi (ile yüklemek
library(R6)
)
- RC'ye benzer, ancak daha hafif ve çok daha hızlı: S4'e veya yöntemlere bağlı değildir paketine . R ortamları üzerine inşa edilmiştir. Ayrıca şunları içerir:
- genel ve özel yöntemler
- etkin bağlamalar (erişildiğinde aslında bir yöntemi çağıran alanlar)
- Paketler arasında çalışan sınıf kalıtımı
- Her iki sınıf yöntemleri (sınıfına aittir ve aracılığıyla bir örneği erişebilirler kodu
self
, private
, super
) ve üye fonksiyonları (alanlarına atanan fonksiyonlar ancak yöntemler hangilerinin sadece fonksiyonlar)
- R'nin "değiştirildiğinde kopyala" anlamından kaçmak için standart bir yol sağlar
- Paket sitesine bakın: "R6: R için kapsüllenmiş nesne yönelimli programlama" .
- Ayrıntılar "Gelişmiş Ar, 2. baskı" Burada .
Diğerleri
Gibi başkaları vardır R.oo (RC benzer), proto (prototip tabanlı, JavaScript düşünün) ve Mutatr . Ancak, "Gelişmiş R" şunu söylüyor:
Yaygın olarak kullanılan R6 dışında, bu sistemler öncelikle teorik olarak ilgi çekicidir. Onların güçlü yanları vardır, ancak çok az R kullanıcısı bunları bilir ve anlar, bu nedenle başkalarının kodunuzu okuması ve katkıda bulunması zordur.
Faslını mutlaka okuyun dengeler içinde "Gelişmiş Ar, 2. baskı" da.