Pemrograman Berbasis Objek atau Object Oriented Programming (OOP) merupakan sebuah paradigma dalam pembuatan sebuah program. OOP menitikberatkan pada identifikasi objek-objek yang terlibat dalam sebuah program dan bagaimana objek-objek tersebut berinteraksi. Pada OOP, program yang dibangun akan dibagi-bagi menjadi objek-objek.
Class merupakan definisi statik (kerangka dasar) dari
objek yang akan diciptakan, berupa struktur yang mendefinisikan data
(property) dan method dari objek. Class
dibagi menjadi:
Property, Merupakan data atau state yang dimiliki oleh
class. Contoh pada class Mobil, memiliki
property: Warna, Model, Produsen
Method, Merupakan behavior (perilaku) sebuah
class. Bisa dikatakan sebagai aksi atau tindakan yang bisa
dilakukan oleh suatu class. Contoh pada class
Mobil, memiliki method: Start, Stop, Change Gear,
Turn
Satu class bisa menghasil banyak object.
Pengembangan awal objek di R menggunakan Class System
S3 yang tidak terlalu ketat. Pendefinisian yang ketat secara
formal, R menggunakan Class System S4.
## [1] "integer"
## [1] "matrix" "array"
A3 <- 1:12 #membuat vektor A2
A4 <- letters[1:12] #membuat vektor A4
B1 <- data.frame(A3,A4) #membuat data frame dari vektor A3 dan A4
B1## [1] "data.frame"
## [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l"
## [1] "character"
A5 <- 10+A3+rnorm(12) #membuat objek A5
B2 <- lm(A5~A3) #membuat model linear
class(B2) #class dari B2## [1] "lm"
## [1] add1 alias anova case.names coerce
## [6] confint cooks.distance deviance dfbeta dfbetas
## [11] drop1 dummy.coef effects extractAIC family
## [16] formula hatvalues influence initialize kappa
## [21] labels logLik model.frame model.matrix nobs
## [26] plot predict print proj qr
## [31] residuals rstandard rstudent show simulate
## [36] slotsFromS3 summary variable.names vcov
## see '?methods' for accessing help and source code
##
## Call:
## lm(formula = A5 ~ A3)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.5197 -0.8266 0.1405 0.5496 1.3362
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 9.27700 0.59103 15.70 2.26e-08 ***
## A3 1.17094 0.08031 14.58 4.59e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.9603 on 10 degrees of freedom
## Multiple R-squared: 0.9551, Adjusted R-squared: 0.9506
## F-statistic: 212.6 on 1 and 10 DF, p-value: 4.589e-08
## [1] "coefficients" "residuals" "effects" "rank"
## [5] "fitted.values" "assign" "qr" "df.residual"
## [9] "xlevels" "call" "terms" "model"
## (Intercept) A3
## 9.277004 1.170936
Fungsi class digunakan untuk menjadikan sebuah objek
menjadi class yang diinginkan. Berikut contoh mengubah
Mobil1 sebagai class baru yaitu
mobil.
class(obj) <- "class.name"
Mobil1 <- list(Nama="Toyota", Panjang=3.5, Lebar=2, Kecepatan=180) #membuat list "Mobil1" dengan berbagai argumen
Mobil1## $Nama
## [1] "Toyota"
##
## $Panjang
## [1] 3.5
##
## $Lebar
## [1] 2
##
## $Kecepatan
## [1] 180
## [1] "list"
class(Mobil1) <- "mobil" #menjadikan Mobil1 sebagai class baru yaitu "mobil"
Mobil2 <- list(Nama="Suzuki", Panjang=1, Lebar=1.8, Kecepatan=150) #membuat list objek "Mobil2"
class(Mobil2) <- "mobil" #menjadikan Mobil2 sebagai class baru yaitu "mobil"
class(Mobil2)## [1] "mobil"
Mengubah menjadi Class menggunakan fungsi konstruktor.
Langkah sederhana dalam membuat objek dari suatu class
sebelumnya sangat tidak dianjurkan karena nilai-nilai instan-nya mungkin
tidak tepat. Fungsi konstruktor menambahkan screening sebelum
menambahkan class.
Mobil <- function(Nama,Panjang,Lebar,Kecepatan){ #
if(Panjang<2 || Lebar<1.5 || Kecepatan<80) #panjang < 2, lebar<1.5, kecepatan<80
stop("atribut tidak sesuai") #jika terpenuhi, maka error
Mobil <- list(Nama=Nama, Panjang=Panjang, Lebar=Lebar, Kecepatan=Kecepatan) #membuat list
class(Mobil) <- "mobil" #mengubah class
Mobil }
Mobil3 <- Mobil("Daihatsu", 2.1, 1.9, 120) #Objek Mobil3 dengan Nama Daihatsu, panjang=2.1, lebar=1.9,kecepatan=120
Mobil3## $Nama
## [1] "Daihatsu"
##
## $Panjang
## [1] 2.1
##
## $Lebar
## [1] 1.9
##
## $Kecepatan
## [1] 120
##
## attr(,"class")
## [1] "mobil"
## [1] "mobil"
Objek Mobil4 akan terjadi error dengan pesan
Error in Mobil(”Proton”, 2, 1.8, 70) : atribut tidak sesuai.
Hal ini dikarenakan kriteria fungsi Mobil tidak memenuhi
kriteria yaitu kecepatan kurang dari 80.
Atau dapat memeriksa satu persatu atribut dengan contoh berikut:
Mobil <- function(Nama,Panjang,Lebar,Kecepatan){ #
if(Panjang<2) #panjang < 2
stop("Panjang tidak sesuai") #jika terpenuhi, maka error
if(Lebar<1.5) #lebar<1.5
stop("Lebar tidak sesuai") #jika terpenuhi, maka error
if(Kecepatan<80) #kecepatan<80
stop("Kecepatan tidak sesuai")#jika terpenuhi, maka error
Mobil <- list(Nama=Nama, Panjang=Panjang, Lebar=Lebar, Kecepatan=Kecepatan) #membuat list
class(Mobil) <- "mobil" #mengubah class
Mobil }
# Mobil5 <- Mobil("Daihatsu", 2.1, 1.9, 70) #Objek Mobil5 dengan Nama Daihatsu, panjang=2.1, lebar=1.9,kecepatan=70Objek Mobil5 juga akan terjadi error dengan pesan
Error in Mobil(”Proton”, 2, 1.8, 70) : atribut tidak sesuai.
Berikut contoh cara langsung (tidak direkomendasikan):
## [1] "Suzuki"
## [1] 2.1
Berikut contoh menggunakan fungsi aksesor:
## [1] "Toyota"
## [1] 120
Fungsi generik merupakan suatu method dari suatu
class objek dalam R. Fungsi generik bertindak untuk beralih
memilih fungsi tertentu atau metode tertentu yang dijalankan sesuai
dengan class-nya. Terdapat beberapa fungsi generik yang
sudah ada: print, plot, dll. Berikut contoh menggunakan
print method :
print.mobil <- function(objek) { #mencetak mobil1 dengan fungsi generik (bukan dalam bentuk list)
print(cat("Nama : ", nama(objek), "\n", "Kecepatan : ",
kecepatan(objek), sep="") ) } #menampilkan data suatu objek dengan method "print"
Mobil1## Nama : Toyota
## Kecepatan : 180NULL
Untuk menciptakan fungsi generik baru, dapat menggunakan syntax:
fungsibaru <- function (objek) UseMethod("fungsibaru").
Class System S4: Mengatasi masalah dalam Class System S3 dengan sistem objek lebih formal.
Salah satu keuntungan: sistem penurunan dari class/objek.
Dalam sistem objek formal: setiap objek didefinisikan secara formal
dalam suatu class. Sebuah class terdiri dari
slot dengan tipe atau class spesifik. Class
dideklarasikan dengan fungsi setClass.
setClass("car", representation(Nama="character", Panjang="numeric",
Lebar="numeric", Kecepatan="numeric")) #membuat setClass dengan nama class "car" dengan atribut nama, panjang, lebar dan kecepatan
Car1 <- new("car", Nama="Toyota", Panjang=3.5, Lebar=2, Kecepatan=180) #membuat objek baru dengan fungsi new
Car1## An object of class "car"
## Slot "Nama":
## [1] "Toyota"
##
## Slot "Panjang":
## [1] 3.5
##
## Slot "Lebar":
## [1] 2
##
## Slot "Kecepatan":
## [1] 180
Car <- function(Nama,Panjang,Lebar,Kecepatan){
if(Panjang<2 || Lebar<1.5 || Kecepatan<80) #panjang < 2, lebar<1.5, kecepatan<80
stop("atribut tidak sesuai") #jika terpenuhi, maka error
new("car", Nama=Nama, Panjang=Panjang, Lebar=Lebar, Kecepatan=Kecepatan) } #objek baru
Car2 <- Car("Suzuki", 2.4, 1.8, 150)
Car2## An object of class "car"
## Slot "Nama":
## [1] "Suzuki"
##
## Slot "Panjang":
## [1] 2.4
##
## Slot "Lebar":
## [1] 1.8
##
## Slot "Kecepatan":
## [1] 150
## [1] "car"
## attr(,"package")
## [1] ".GlobalEnv"
## [1] "mobil"
Berikut contoh cara langsung (tidak direkomendasikan):
## [1] "Toyota"
## [1] 150
Berikut contoh menggunakan fungsi aksesor:
nama1 <- function(objek) objek@Nama #membuat akses dengan fungsi aksesor
kecepatan1 <- function(objek) objek@Kecepatan
nama1(Car1) #nama dari car1 menggunakan fungsi aksesor yang telah dibuat## [1] "Toyota"
## [1] 150
Fungsi generik show setara dengan fungsi generik
print pada class System S3. Penciptaan fungsi
generik menggunakan fungsi setMethod. Berikut contoh
menggunakan class method :
setMethod(show, "car", function(object) { #membuat fungsi generik menggunakan fungsi setMethod
print(cat("Nama : ", nama1(object), "\n", "Kecepatan : ",
kecepatan1(object), sep="") )} ) #menampilkan data pada objek dengan method "show"
Car2## Nama : Suzuki
## Kecepatan : 150NULL
Untuk menciptakan fungsi generik baru pada class System S4, dapat menggunakan syntax:
setGeneric("fungsibaru", function(objek) standardGeneric("fungsibaru"))