Berikut adalah ikhtisar cepat yang diperbarui dari berbagai sistem objek R menurut "Advanced R, edisi ke-2" (CRC Press, 2019) oleh Hadley Wickham (Kepala Ilmuwan di RStudio), yang memiliki representasi web di sini , berdasarkan bab tentang Objek Pemrograman Berorientasi .
Edisi pertama 2015 memiliki representasi web di sini , dengan bab terkait OO di sini .
Pendekatan ke sistem OO
Hadley mendefinisikan berikut ini untuk membedakan dua pendekatan berbeda untuk pemrograman OO:
OOP fungsional : metode (potongan kode yang dapat dipanggil) milik fungsi generik (jangan disamakan dengan metode umum Java / C # ). Pikirkan metode yang terletak di tabel pencarian global. Metode untuk mengeksekusi ditemukan oleh sistem runtime berdasarkan nama fungsi dan jenis (atau kelas objek) dari satu atau lebih argumen yang diteruskan ke fungsi itu (ini disebut "pengiriman metode"). Sintaks-bijaksana, metode panggilan mungkin terlihat seperti fungsi panggilan biasa: myfunc(object, arg1, arg2)
. Panggilan ini akan mengarahkan runtime untuk mencari metode yang terkait dengan pasangan ("myfunc", typeof (object)) atau mungkin ("myfunc", typeof (object), typeof (arg1), typeof (arg2))jika bahasa mendukung itu. Di R's S3, nama lengkap dari fungsi generik memberikan pasangan (nama-fungsi, kelas) . Sebagai contoh: mean.Date
adalah metode untuk menghitung rata-rata Tanggal. Cobalah methods("mean")
untuk membuat daftar metode umum dengan nama fungsi mean
. Pendekatan OOP Fungsional ditemukan misalnya di Smalltalk perintis OO , Sistem Objek Lisp Umum dan Julia . Hadley mencatat bahwa "Dibandingkan dengan R, implementasi Julia telah berkembang sepenuhnya dan sangat berkinerja."
OOP terenkapsulasi : metode milik objek atau kelas, dan pemanggilan metode biasanya terlihat seperti object.method(arg1, arg2)
. Ini disebut enkapsulasi karena objek merangkum data (bidang) dan perilaku (metode). Bayangkan metode ini terletak di tabel pencarian yang dilampirkan ke objek atau deskripsi kelas objek. Runtime mencari metode berdasarkan nama metode dan mungkin jenis dari satu atau beberapa argumen. Ini adalah pendekatan yang ditemukan dalam bahasa OO "populer" seperti C ++, Java, C #.
Dalam kedua kasus tersebut, jika warisan didukung (mungkin memang demikian), runtime dapat melintasi hierarki kelas ke atas hingga menemukan kecocokan untuk kunci pencarian panggilan.
Bagaimana cara mengetahui sistem apa yang dimiliki objek R.
library(sloop) # formerly, "pryr"
otype(mtcars)
#> [1] "S3"
Sistem objek R.
S3
- Pendekatan OOP fungsional.
- Sistem terpenting menurut Hadley.
- Paling sederhana, paling umum. Sistem OO pertama yang digunakan oleh R.
- Dilengkapi dengan basis R, digunakan di seluruh basis R.
- Bergantung pada konvensi daripada jaminan yang diberlakukan.
- Lihat Chambers, John M, dan Trevor J Hastie. 1992. "Model Statistik di S." Wadsworth & Brooks / Cole Advanced Books & Software.
- Detail ada di "Advanced R, 2nd edition" di sini .
S4
- Pendekatan OOP fungsional.
- Sistem terpenting ketiga menurut Hadley.
- Penulisan ulang S3, oleh karena itu mirip dengan S3, tetapi lebih formal dan lebih ketat: ini memaksa Anda untuk memikirkan dengan hati-hati tentang desain program. Cocok untuk membangun sistem besar (misalnya proyek Biokonduktor ).
- Diimplementasikan dalam paket "metode" dasar.
- Lihat: Chambers, John M. 1998. "Programming with Data: A Guide to the S Language." Peloncat.
- Detail ada di "Advanced R, 2nd edition" di sini .
RC alias "Kelas Referensi"
- Pendekatan OOP yang dikemas.
- Dilengkapi dengan basis R.
- Berdasarkan S4.
- Objek RC adalah tipe khusus dari objek S4 yang juga "bisa berubah". yaitu, alih-alih menggunakan semantik salin-saat-modifikasi biasa R, semantik ini dapat dimodifikasi di tempat. Perhatikan bahwa status yang bisa berubah sulit untuk dipikirkan dan merupakan sumber bug yang buruk, tetapi dapat menyebabkan kode yang lebih efisien dalam aplikasi tertentu.
R6
- Pendekatan OOP yang dikemas.
- Sistem terpenting kedua menurut Hadley.
- Dapat ditemukan di paket R6 (instal dengan
library(R6)
)
- Mirip dengan RC, tetapi lebih ringan & lebih cepat: tidak bergantung pada S4 atau paket metode . Dibangun di atas lingkungan R. Juga memiliki:
- metode publik dan privat
- ikatan aktif (bidang, yang, saat diakses, sebenarnya memanggil metode)
- class inhertance yang bekerja di seluruh paket
- kedua metode kelas (kode yang milik kelas dan dapat mengakses sebuah contoh melalui
self
, private
, super
) dan fungsi anggota (fungsi ditugaskan untuk bidang, tetapi yang tidak metode, hanya fungsi)
- Menyediakan cara standar untuk keluar dari semantik "salin-saat-modifikasi" R
- Lihat situs paket: "R6: Pemrograman berorientasi objek yang dikemas untuk R" .
- Detail ada di "Advanced R, 2nd edition" di sini .
Lainnya
Ada yang lain, seperti R.oo (mirip dengan RC), proto (berbasis prototipe, pikirkan JavaScript) dan Mutatr . Namun, "Advanced R" mengatakan:
Selain R6, yang banyak digunakan, sistem ini terutama merupakan kepentingan teoretis. Mereka memang memiliki kelebihan, tetapi hanya sedikit pengguna R yang mengetahui dan memahaminya, jadi sulit bagi orang lain untuk membaca dan berkontribusi pada kode Anda.
Pastikan untuk membaca bab trade-off di "Advanced R, 2nd edition" juga.