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)^pwreturn(z)}# menggunakan fungsi angka_acak1(10,2)
# Membuat fungsiangka_acak2 <-function(n, pw) { x <-runif(n) y <-runif(n) z <- (x+y)^pwreturn(list(nilai_x=x,nilai_y=y,nilai_z=z))}# Menggunakan fungsiangka_acak2(10,2)
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)^pwreturn(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)^pwreturn(z)}n <-5; pw <-3angka_acak4()
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 S3person <-list(name ="Syafiq", age =25)class(person) <-"Person"## Membuat method untuk printprint.Person <-function(x) {cat("Nama:", x$name, "\n")cat("Umur:", x$age, "tahun\n")}## Coba printperson
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 classsetClass("Person",slots =list(name ="character", age ="numeric"))## Membuat objectp1 <-new("Person", name ="Syafiq", age =25)## Definisi method untuk menampilkan objectsetMethod("show", "Person", function(object) {cat("Nama:", object@name, "\n")cat("Umur:", object@age, "tahun\n")})## Coba printp1
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.
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)
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
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?
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!
Apakah fungsi summary menampilkan hal yang sama saat diaplikasikan pada objek nilaiPemro2?
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
Buatlah suatu pengaturan agar objek nilaiPemro2 bisa menampilkan output dari fungsi summary yang diperuntukan untuk kelas data.frame dan fungsi ringkasan!