Untuk membantu Anda memulai S3, lihat kode untuk median
fungsi tersebut. Mengetik median
pada prompt perintah menunjukkan bahwa ia memiliki satu baris dalam tubuhnya, yaitu
UseMethod("median")
Artinya, ini adalah metode S3. Dengan kata lain, Anda dapat memiliki median
fungsi berbeda untuk kelas S3 yang berbeda. Untuk mendaftar semua metode median yang mungkin, ketik
methods(median) #actually not that interesting.
Dalam kasus ini, hanya ada satu metode, default, yang dipanggil untuk apa saja. Anda dapat melihat kode untuk itu dengan mengetik
median.default
Contoh yang jauh lebih menarik adalah print
fungsi, yang memiliki banyak metode berbeda.
methods(print) #very exciting
Perhatikan bahwa beberapa metode memiliki *
s di samping namanya. Itu berarti mereka tersembunyi di dalam beberapa namespace paket. Gunakan find
untuk mengetahui paket mana yang mereka masuki. Misalnya
find("acf") #it's in the stats package
stats:::print.acf
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. Cobalahmethods("mean")
untuk membuat daftar metode umum dengan nama fungsimean
. 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.
Sistem objek R.
S3
S4
RC alias "Kelas Referensi"
R6
library(R6)
)self
,private
,super
) dan fungsi anggota (fungsi ditugaskan untuk bidang, tetapi yang tidak metode, hanya fungsi)Lainnya
Ada yang lain, seperti R.oo (mirip dengan RC), proto (berbasis prototipe, pikirkan JavaScript) dan Mutatr . Namun, "Advanced R" mengatakan:
Pastikan untuk membaca bab trade-off di "Advanced R, 2nd edition" juga.
sumber