Pemrograman Fungsi R

Author

Muhammad Syafiq

Rangkuman Materi

Fungsi built-in

R memiliki banyak sekali fungsi built-in yang dapat dipanggil secara langsung ke dalam program tanpa harus diinisialisasi terlebih dahulu.

sqrt(16)       # akar kuadrat → 4
[1] 4
abs(-10)       # nilai absolut → 10
[1] 10
log(100)       # log natural (basis e)
[1] 4.60517
log10(100)     # log basis 10 → 2
[1] 2
exp(2)         # e^2 → 7.389
[1] 7.389056
round(3.14159, 2)  # pembulatan → 3.14
[1] 3.14

Fungsi user-defined

Tidak semua fungsi yang dibutuhkan ada di dalam R. Oleh karena itu, pemrogram dapat menciptakan fungsi sendiri sesuai penggunaan atau analisis yang akan dilakukan. Untuk membuat fungsi, beberapa komponen dari fungsi perlu diperhatikan yaitu nama fungsi, argumen dari fungsi, tubuh atau isi dari fungsi tersebut, dan diakhiri dengan nilai kembali atau return value. Berikut ini contoh penggunaan atau struktur dari fungsi user-defined

Fungsi 1 dengan output hanya nilai z saja.

angka_acak1 <- function(n, pw) {
  x <- runif(n)
  y <- runif(n)
  z <- (x+y)^pw
  return(z)
}
# menggunakan fungsi  
angka_acak1(10,2)
 [1] 1.1647586 0.5668475 1.9067678 1.3060717 2.3319976 1.3644606 1.3327321
 [8] 2.3886272 0.8778992 1.8274733

Fungsi 2 dengan output berupa nilai x, y, dan z.

# Membuat fungsi
angka_acak2 <- function(n, pw) {
  x <- runif(n)
  y <- runif(n)
  z <- (x+y)^pw
  return(list(nilai_x=x,nilai_y=y,nilai_z=z))
}

# Menggunakan fungsi
angka_acak2(10,2)
$nilai_x
 [1] 0.22916838 0.48617238 0.66665741 0.81309413 0.42749122 0.73966535
 [7] 0.71436224 0.62534028 0.00433918 0.03374909

$nilai_y
 [1] 0.89472509 0.77802823 0.38203862 0.34137329 0.53094092 0.02919184
 [7] 0.46746885 0.22661818 0.14876943 0.83794860

$nilai_z
 [1] 1.26313655 1.59820319 1.09976336 1.33279503 0.91859215 0.59114138
 [7] 1.39672474 0.72583322 0.02344225 0.75985687

Fungsi 3 dengan memberikan nilai default pada argumen berupa n = 1 dan pw = 2, sehingga ketika fungsi tersebut dipanggil tanpa menuliskan argumen, akan dijalankan fungsi defaultnya.

angka_acak3 <- function(n=1, pw=2) {
  x <- runif(n)
  y <- runif(n)
  z <- (x+y)^pw
  return(z)
}

angka_acak3()
[1] 0.1989443

Fungsi 4 dituliskan tanpa menggunakan argumen. Ketika fungsi tersebut akan digunakan maka dilakukan assign nilai yang diperlukan di dalam fungsi tersebut.

angka_acak4 <- function() {
  x <- runif(n)
  y <- runif(n)
  z <- (x+y)^pw
  return(z)
}

n <- 5; pw <- 3
angka_acak4()
[1] 0.075901366 1.022591711 5.138068886 4.815147092 0.004841629

Object Oriented Programming

S3

  • Sederhana dan fleksibel (tidak terlalu ketat).

  • Tidak benar-benar mendefinisikan class structure, cukup menempelkan sebuah atribut class ke objek.

  • Perilaku ditentukan oleh generic functions seperti print(), summary(), plot(), dsb.

  • Fungsi akan mencari metode sesuai nama class: print.myclass, summary.myclass, dll.

## Membuat object dengan class S3
person <- list(name = "Syafiq", age = 25)
class(person) <- "Person"

## Membuat method untuk print
print.Person <- function(x) {
  cat("Nama:", x$name, "\n")
  cat("Umur:", x$age, "tahun\n")
}

## Coba print
person
Nama: Syafiq 
Umur: 25 tahun

S4

  • Lebih formal & ketat dibanding S3.

  • Class harus didefinisikan dengan setClass().

  • Method harus didefinisikan dengan setMethod().

  • Cocok untuk program besar karena struktur lebih jelas.

## Definisi class
setClass(
  "Person",
  slots = list(name = "character", age = "numeric")
)

## Membuat object
p1 <- new("Person", name = "Syafiq", age = 25)

## Definisi method untuk menampilkan object
setMethod("show", "Person", function(object) {
  cat("Nama:", object@name, "\n")
  cat("Umur:", object@age, "tahun\n")
})

## Coba print
p1
Nama: Syafiq 
Umur: 25 tahun

S3 vs S4

Aspek S3 S4
Struktur Fleksibel (pakai list) Formal (pakai setClass)
Validasi atribut Tidak ada Ada (tipe slot harus sesuai)
Method fungsi.class setMethod("fungsi","class",...)
Akses atribut $ @
Kegunaan Cepat, analisis eksploratif Proyek besar, package resmi

Contoh S3 dan S4

Sebagai ilustrasi akan dibuat studentBio yang berisi daftar komponen student_nama, student_umur, and student_kontak. Class ini diberi nama Student Info dan studentBio adalah suatu kelas baru yang memiliki nilai sebagai berikut.

studentBio <- list(student_nama = "Harry Potter", student_umur = 19, student_kontak="London")
class(studentBio) <- "StudentInfo"
studentBio
$student_nama
[1] "Harry Potter"

$student_umur
[1] 19

$student_kontak
[1] "London"

attr(,"class")
[1] "StudentInfo"

Kemudian dibuat fungsi generik kontak dimana fungsi ini akan diberikan kepada objek yang akan diinisialisasi. Dengan menggunakan fungsi UseMethod pada fungsi generik kontak, maka properti student_kontak pada class studentBio di atas dapat diakses hanya dengan menyertakan simbol dot menjadi kontak.studentBio.

kontak <- function(object) {
  UseMethod("kontak")
}

Sehingga objek dapat dipanggil dengan contoh berikut

kontak.StudentInfo <- function(object) {
  cat("Kontak anda adalah", object$student_kontak, "\n")
}
kontak(studentBio)
Kontak anda adalah London 
cetakumur <- function(object) {
  UseMethod("cetakumur")
}
cetakumur.StudentInfo <- function(object) {
  cat("Umur ", object$student_nama, " adalah ", object$student_umur, "\n")
}
cetakumur(studentBio)
Umur  Harry Potter  adalah  19 

Berbeda dengan S3 Class, S4 Class lebih ketat, konvensional, dan lebih mirip dengan konsep object-oriented. Secara spesifik S4, memilki fungsi setter dan getter untuk fungsi method dan generiknya. Dalam menginisialisasi suatu class, digunakan fungsi setClass().

Berikut ini dibuat sebuat class mahasiswa dengan karakter yaitu

setClass("mahasiswa", slots=list(nama="character", nim="numeric", kontak="character"))

Buat objek menggunakan new isi dengan nilai yang sesuai

obj <- new("mahasiswa", nama="Alfa", nim=1501211013, kontak="Bogor")
obj
An object of class "mahasiswa"
Slot "nama":
[1] "Alfa"

Slot "nim":
[1] 1501211013

Slot "kontak":
[1] "Bogor"

Dengan membuat method generik di Class S4, maka akses properti atau method menggunakan simbol @

setMethod("show", "mahasiswa",
  function(object) {
    cat("Nama:",object@nama, "\n")
    cat("NIM:",object@nim, "\n")
    cat("Kontak:", object@kontak, "\n")
  }
)
obj
Nama: Alfa 
NIM: 1501211013 
Kontak: Bogor 

Latihan Soal

  1. Buatlah suatu objek bernama nilaiPemro yang dibuat dengan fungsi data.frame. Isi dari objek tersbut didasarkan pada Tabel dibawah ini:
      Nama      UTS    Tugas
1     Nada 81.96175 75.91649
2    Aries 80.05716 74.83705
3    Anisa 74.45149 73.39788
4 Istiqlal 79.60171 74.16479
5  Muayyad 76.40355 75.36194
6    Dikky 76.01078 74.67621
  1. Periksalah kelas dari objek tersebut!
  2. Periksa fungsi/metode (generik) apa saja yang bisa diaplikasikan pada kelas tersebut! apakah fungsi summary termasuk salah satunya? Jika iya, jalankan fungsi summary pada objek tersebut! Apa yang ditampilkan?
  3. Buatlah kelas baru yang bernama "nilai" menggunakan sistem kelas S3, kemudian buatlah objek baru yang bernama nilaiPemro2, dimana objek terbut merupakan salinan dari objek nilaiPemro! Definisikan kelas "nilai pada objek nilaiPemro2!
  4. Apakah fungsi summary menampilkan hal yang sama saat diaplikasikan pada objek nilaiPemro2?
  5. Buatlah suatu fungsi yang bernama ringkasan dimana fungsi tersebut hanya bisa diakses oleh kelas "nilai" atau fungsi aksesor dari kelas "nilai! Fungsi Tersebut menampilkan Keterangan sebagai berikut:
rata-rata nilai UTS Mahasiswa 80 
rata-rata nilai Tugas Mahasiswa 90 
Nilai UAS tertinggi diraih oleh Riska 
Nilai Tugas tertinggi diraih oleh Ibnu 
  1. Buatlah suatu pengaturan agar objek nilaiPemro2 bisa menampilkan output dari fungsi summary yang diperuntukan untuk kelas data.frame dan fungsi ringkasan!

Referensi:

rpubs.com/gdito

rpubs.com/alfanugraha/r-func-oo