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. Object : Class System S3

A1 <- c(1:10) #membuat vektor A1 1 sampai 10
class(A1) #class A1 
## [1] "integer"
A2 <- matrix(A1,2,5) #membuat matriks A2
class(A2) #class A2
## [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
class(B1) #class dari B1 
## [1] "data.frame"
B1$A4
##  [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l"
class(B1$A4) #class dari B1$B4
## [1] "character"
A5 <- 10+A3+rnorm(12) #membuat objek A5
B2 <- lm(A5~A3) #membuat model linear 
class(B2) #class dari B2
## [1] "lm"
methods(class=class(B2)) #metode secara default
##  [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
summary(B2) #salah satu metode pada class lm, yaitu summary
## 
## 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
names(B2) #melihat names di objek B2
##  [1] "coefficients"  "residuals"     "effects"       "rank"         
##  [5] "fitted.values" "assign"        "qr"            "df.residual"  
##  [9] "xlevels"       "call"          "terms"         "model"
B2$coefficients #melihat nilai koefisien pada B2
## (Intercept)          A3 
##    9.277004    1.170936

Mengubah Menjadi Class

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
class(Mobil1) #class dari Mobil1
## [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"

Fungsi Konstruktor

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"
class(Mobil3)
## [1] "mobil"
# Mobil4 <- Mobil("Proton", 2, 1.8, 70)

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=70

Objek Mobil5 juga akan terjadi error dengan pesan Error in Mobil(”Proton”, 2, 1.8, 70) : atribut tidak sesuai.


Fungsi Aksesor

Berikut contoh cara langsung (tidak direkomendasikan):

Mobil2$Nama #melihat nama dari objek Mobil2 dengan $
## [1] "Suzuki"
Mobil3$Panjang #melihat panjang dari objek Mobil3 dengan $
## [1] 2.1

Berikut contoh menggunakan fungsi aksesor:

nama <- function(objek) objek$Nama
kecepatan <- function(objek) objek$Kecepatan

nama(Mobil1) 
## [1] "Toyota"
kecepatan(Mobil3)
## [1] 120

Fungsi Generik

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").


2. Object : Class System S4

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.


Membuat Object S4

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

Fungsi Konstruktor

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
class(Car2) #class dari Car2
## [1] "car"
## attr(,"package")
## [1] ".GlobalEnv"
class(Mobil1)
## [1] "mobil"

Fungsi Aksesor (Akses Terhadap Slot)

Berikut contoh cara langsung (tidak direkomendasikan):

Car1@Nama #akses menggunakan @ pada S4 utk melihat nama dari Car1
## [1] "Toyota"
Car2@Kecepatan #akses menggunakan @ pada S4 utk melihat kecepatan dari Car2
## [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"
kecepatan1(Car2) #nama dari car1 menggunakan fungsi aksesor yang telah dibuat
## [1] 150

Fungsi Generik

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"))