Fungsi di R

2019/04/20

Fungsi yang tersedia di R

Paket dasar R memiliki banyak fungsi yang dapat digunakan. Operasi matematika sederhana, misalnya, dapat dengan mudah dijalankan di R. Sebuah fungsi terdiri atas satu atau beberapa argumen. Bagaimana mengetahui penjelasan sebuah fungsi dapat menggunakan bantuan, misalnya fungsi untuk penjumlahan:

?'+'

Fungsi + digunakan untuk menjumlahkan dua vektor numerik.

'+'(1,1)
## [1] 2
class(`+`)
## [1] "function"
(a <- seq(1,10, by = 2))
## [1] 1 3 5 7 9
(b <- seq(2, 100, length.out = 5))
## [1]   2.0  26.5  51.0  75.5 100.0
'+'(a,b)
## [1]   3.0  29.5  56.0  82.5 109.0

Pada kasus ini operasi penjumlahan dapat pula ditulis:

1+1
## [1] 2
a+b
## [1]   3.0  29.5  56.0  82.5 109.0

Membuat fungsi sederhana sendiri

Penghitungan ragam sebuah vektor numerik dapat menggunakan fungsi yang tersedia di R yaitu var. Misalnya, ragam untuk vektor b adalah

var(b)
## [1] 1500.625

Ragam juga dapat dicari dengan menggunakan fungsi yang dibuat sendiri. Rumus untuk ragam adalah \[\begin{equation} s^2 = \frac{1}{n} \sum_{i=1}^n (x_i - \bar{x})^2, \end{equation}\] sehingga fungsi buatan sediri dapat berupa:

ragam <- function(x) { #ragam adalah nama fungsi buatan, dan x adalah argumen
  n <- length(x) # cari nilai n dari vektor x
  rataan <- mean(x) # cari nilai rataan dari vektor x
  jk <- sum((x - rataan)^2) #cari jumlah kuadrat
  hasil <- jk/(n-1) #cari ragam berdasarkan rumus
  return(hasil)
}

Satu baris fungsi juga dapat dibuat, misalnya:

ragam2 <- function(x) { 
  sum((x - mean(x))^2)/(length(x)-1)
}
class(ragam)
## [1] "function"
class(ragam2)
## [1] "function"

Kedua fungsi ini kemudian dapat digunakan untuk mencari ragam dari vektor b dengan hasil yang sama.

ragam(b)
## [1] 1500.625
ragam2(b)
## [1] 1500.625

Penulis lebih menyukai cara pertama yang terdiri atas beberapa baris karena pengguna lain dapat membaca kode dengan lebih baik. Cara pertama juga mempunyai nilai return yang sangat disarankan saat membuat sebuah fungsi. argument sebuah fungsi dapat diberi nilai default, artinya jika pengguna tidak memasukkan nilai pada argument, fungsi akan mengeluarkan hasil default-nya. Misalnya, numerik vektor dari 1 sampai 10 sebagai nilai default maka jika pada argument tidak diberi nilai, fungsi akan mencari nilai ragam dari numerik vektor 1 sampai 10.

ragam3 <- function(x = c(1:10)) { 
  sum((x - mean(x))^2)/(length(x)-1)
}
ragam3(b)
## [1] 1500.625
ragam3()
## [1] 9.166667
ragam3(1:10)
## [1] 9.166667

Jika tidak ada nilai default seperti pada fungsi ragam2, maka tanpa memberikan nilai pada argument hasilnya adalah error.

ragam2()
Error in ragam2() : argument "x" is missing, with no default

Fungsi dengan beberapa argument juga dapat dibuat. Beberapa argument ini dapat berupa (1) diberi nilai default semua, (2) tidak diberi nilai default semua, atau (3) dicampur. Kebutuhan perlu atau tidaknya memberikan nilai default pada argument, tergantung dari si pembuat fungsi. Jika dengan nilai default membantu pengguna, maka si pembuat fungsi sebaiknya menggunakan nilai default pada argument dan sebaliknya.

Fungsi pada sebuah paket

Contoh pembuatan fungsi ragam diatas adalah contoh sederhana yang tidak perlu dilakukan karena R memiliki fungsi var untuk menghitung ragam. Lalu, kapan kita membutuhkan fungsi yang dibuat sendiri? Jawabannya adalah saat orang lain belum ada yang membuatnya atau setelah mencari fungsi tersebut dan tidak ditemukan.

Saat ingin mencari sebuah fungsi untuk menganalisis data, mesin pencari, misalnya google, dapat digunakan apakah fungsi tersebut sudah tersedia di paket tertentu atau sudah pernah ada yang membuat. Stack overflow (so) juga dapat digunakan sebagai sumber untuk mencari informasi/ bertanya.

Berikut contoh perhitungan jarak antar obyek dengan menggunakan jarak binary, yaitu fungsi dist dari paket dasar R. Jika ingin menghitung jarak simple matching, paket dasar tidak menyediakan fungsi ini, sehingga perlu menggunakan paket tambahan. Misalnya, paket kmed yang menyediakan fungsi matching untuk menghitung jarak simple matching. Berikut contoh penggunaan fungsi dist dan matching dari paket kmed untuk menghitung jarak dari 5 obyek dengan variabel binary.

dt <- iris[1:5,1:2]
dt[,1] <- dt[,1] < 5
dt[,2] <- dt[,2] < 3.1
colnames(dt) <- c("x", "y")
dt ##data dengan 5 obyek yang memiliki 2 variabel binary
##       x     y
## 1 FALSE FALSE
## 2  TRUE  TRUE
## 3  TRUE FALSE
## 4  TRUE FALSE
## 5 FALSE FALSE
(bindist <- dist(dt, method = "binary", diag = TRUE, upper = TRUE)) #jarak binary dari paket dasar
##     1   2   3   4   5
## 1 0.0 1.0 1.0 1.0 0.0
## 2 1.0 0.0 0.5 0.5 1.0
## 3 1.0 0.5 0.0 0.0 1.0
## 4 1.0 0.5 0.0 0.0 1.0
## 5 0.0 1.0 1.0 1.0 0.0
(matchdist <- kmed::matching(dt,dt)) #jarak simple matching dari paket kmed
##     1   2   3   4   5
## 1 0.0 1.0 0.5 0.5 0.0
## 2 1.0 0.0 0.5 0.5 1.0
## 3 0.5 0.5 0.0 0.0 0.5
## 4 0.5 0.5 0.0 0.0 0.5
## 5 0.0 1.0 0.5 0.5 0.0

Perhatikan bahwa kmed::matching digunakan untuk menggunakan fungsi matching dari paket kmed. Praktek menggunakan :: sangat disarankan saat pengguna menggunakan banyak library karena nama fungsi yang sama dapat ditemukan pada dua paket yang berbeda, sehingga penulisan namapaket::fungsi lebih baik dan aman dari kesalahan mengambil sebuah fungsi. Jika saat kmed::matching(dt,dt)) dijalankan yang muncul adalah Error in loadNamespace(name) : there is no package called ‘kmed’, maka paket kmed perlu diinstal dulu dengan menggunakan install.packages("kmed").