Pengenalan Paket

Instalasi paket dari CRAN dan GitHub serta struktur paket mini.

Daftar isi

Topik ini membahas paket sebagai unit distribusi kode R, mulai dari konsepnya, instalasi dari CRAN dan GitHub, pemuatan ke sesi, sampai struktur berkas sebuah paket mini bernama kalkulatorujian. Setelah membacanya, proses di balik install.packages() dan library() menjadi jelas, dan struktur paket yang selama ini hanya diunduh dapat dibaca serta disusun sendiri.

Paket sebagai unit distribusi kode#

Paket (package) adalah bundel yang menyatukan fungsi, dokumentasinya, dan metadata versi ke dalam satu unit yang mudah dibagikan dan dipasang. Seluruh kode sebelumnya memang sering dipanggil dari paket, mulai dari mean() dari basis R sampai map_dbl() dari purrr. Fungsi yang sudah ditulis sendiri pun berlaku sama, yaitu menghabiskan waktu sekali untuk merapikannya menjadi paket, lalu seluruh proyek berikutnya memuatnya dengan satu baris library().

Sumber paket yang resmi adalah CRAN (Comprehensive R Archive Network), yaitu repositori terpusat yang menguji setiap kiriman di berbagai sistem operasi sebelum diterbitkan. Karena pengujian itu, paket dari CRAN dapat dipasang dengan keyakinan bahwa kodenya berjalan dan dokumentasinya lengkap. Setiap paket juga membawa nomor versinya sendiri, sehingga perilaku kode yang bergantung pada versi tertentu dapat dinyatakan dengan tepat, misalnya purrr 1.2.2 yang dipakai contoh-contoh modul ini. Struktur berkas paket membuat semua itu mungkin, dan strukturnya diperlihatkan pada bagian akhir topik ini.

Instalasi dari CRAN#

Paket dipasang dengan install.packages() yang mengunduh berkas paket dari cermin (mirror) CRAN, lalu memasangnya ke pustaka (library) R pada komputer. Prosesnya memerlukan koneksi internet dan dapat memakan waktu, terutama untuk paket yang memuat kode terkompilasi. Instalasi paket tidyverse dijalankan dengan:

r
# tidak-dijalankan
# instalasi dari CRAN memerlukan koneksi internet
install.packages("tidyverse")

Perintah di atas tidak dieksekusi di sini karena membutuhkan akses jaringan, tetapi bentuknya persis seperti yang dijalankan pada komputer pembaca. Saat instalasi, R memeriksa paket yang cocok untuk versi R yang berjalan, lalu mengompilasi bagian kodenya bila ada, dan pesan prosesnya cukup panjang. Bagian yang paling penting dilihat adalah baris akhir yang menyatakan paket selesai dipasang. install.packages() cukup dijalankan sekali untuk setiap paket pada satu komputer, dan paketnya bertahan sampai secara sengaja dihapus atau diperbarui.

Memuat paket ke sesi#

Paket yang sudah terpasang belum otomatis tersedia di dalam sesi R. Fungsi library() melampirkan paket ke sesi sehingga seluruh fungsinya dapat dipanggil langsung, dan pelampiran ini perlu diulang di setiap sesi baru karena tidak tersimpan antar sesi. Memuat tidyverse memperlihatkan daftar paket inti yang ikut terlampir beserta konflik nama yang mungkin terjadi:

r
# memuat paket yang sudah terpasang ke dalam sesi
library(tidyverse)
text Keluaran
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.2.1     ✔ readr     2.2.0
✔ forcats   1.0.1     ✔ stringr   1.6.0
✔ ggplot2   4.0.3     ✔ tibble    3.3.1
✔ lubridate 1.9.5     ✔ tidyr     1.3.2
✔ purrr     1.2.2     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors

Bagian Conflicts pada banner bukan pesan error, melainkan catatan bahwa fungsi seperti filter() dari dplyr menutupi fungsi bernama sama dari paket stats. Pemanggilan filter() selanjutnya memakai versi dplyr karena paket itu dimuat lebih belakangan, dan versi stats tetap dapat dipanggil dengan stats::filter(). Tanpa melampirkan paketnya, nama lengkap seperti purrr::map_dbl() tetap dapat dipanggil kapan saja, dan gaya ini sering dipilih untuk skrip yang hanya membutuhkan satu atau dua fungsi. Pelampiran penuh lebih nyaman untuk analisis yang menggunakan banyak fungsi dari paket yang sama. Pembagian peran kedua perintah inti dirangkum pada tabel berikut:

PerintahFrekuensiTujuan
install.packages()sekali per komputermengunduh dan memasang paket dari repositori
library()setiap sesi barumelampirkan paket agar fungsinya dapat dipanggil

Instalasi dari GitHub#

Paket yang sedang dikembangkan sering kali belum terbit di CRAN, dan repositori GitHub menjadi tempat versi terbarunya. Instalasi dari GitHub dilakukan dengan bantuan paket remotes atau pak, misalnya remotes::install_github("tidyverse/dplyr") untuk memasang versi pengembangan dplyr langsung dari repositori resminya:

r
# tidak-dijalankan
# instalasi dari GitHub memerlukan koneksi internet
remotes::install_github("tidyverse/dplyr")

Paket dari CRAN tetap menjadi pilihan utama untuk pekerjaan sehari-hari karena telah melalui pengujian penerbitan, sedangkan paket dari GitHub berisi versi terbaru yang belum tentu stabil. Paket alat seperti remotes dipasang terlebih dahulu dari CRAN, lalu fungsi install_github()-nya mengunduh repositori yang dituju dan memasangnya seperti paket biasa. Argumennya berformat pemilik/repositori, sehingga "tidyverse/dplyr" menunjuk repositori dplyr milik organisasi tidyverse. Kedua jalur instalasi tersebut menghasilkan paket dengan struktur berkas yang sama, dan struktur itulah yang dibedah berikut ini.

Struktur paket mini#

Paket paling sederhana terdiri atas berkas deskripsi, daftar fungsi yang diekspor, dan folder R/ yang memuat kode fungsinya. Paket mini kalkulatorujian berisi satu fungsi saja, dengan struktur berkas sebagai berikut:

text Struktur berkas paket mini kalkulatorujian
kalkulatorujian/
├── DESCRIPTION
├── NAMESPACE
├── R/
│   └── fungsi.R
└── man/
    └── rata_rata_aman.Rd

Berkas DESCRIPTION memuat identitas paket, yaitu namanya, judul, versi, pembuat, deskripsi, dan lisensinya:

yaml DESCRIPTION
Package: kalkulatorujian
Title: Kalkulator Nilai Ujian
Version: 0.1.0
Authors@R: person("Ali", "Pratama", email = "[email protected]", role = c("aut", "cre"))
Description: Kumpulan fungsi sederhana untuk menghitung statistik nilai ujian.
License: MIT
Encoding: UTF-8

Kode fungsi hidup di dalam folder R/, dan setiap berkas di situ dapat memuat satu atau beberapa fungsi. Nama folder tersebut diawali huruf kapital sesuai konvensi paket R, sedangkan berkasnya berformat teks biasa yang dapat dibaca tanpa alat khusus. Berkas fungsi.R memuat satu fungsi yang sudah dikenal dari topik penulisan fungsi:

r fungsi.R
# Rata-rata nilai ujian yang aman terhadap NA
rata_rata_aman <- function(x, na.rm = TRUE) {
  mean(x, na.rm = na.rm)
}

Berkas NAMESPACE menyatakan fungsi mana yang diekspor, yaitu fungsi yang terlihat oleh pengguna paket setelah library() dijalankan:

r NAMESPACE
export(rata_rata_aman)

Folder man/ memuat halaman dokumentasi satu berkas per fungsi, sebagaimana halaman bantuan yang dibuka dengan tanda ?. Ketiga berkas contoh di atas adalah bentuk teks biasa, sehingga paket mini yang sudah terbentuk dapat dibaca tanpa alat khusus.

Membuat dokumentasi dengan devtools::document()#

Halaman dokumentasi di folder man/ tidak ditulis secara manual, melainkan dibangkitkan dari komentar roxygen yang menempel di atas setiap fungsi. Setiap baris komentarnya diawali #', dan isinya tersusun baku, yaitu @param untuk setiap argumen, @return untuk nilai balik, dan @examples untuk contoh pemanggilan. Alur kerjanya berurutan: lengkapi DESCRIPTION, tulis fungsi di folder R/ disertai komentar roxygen, lalu jalankan devtools::document(). Pemanggilan tersebut menerjemahkan komentar menjadi berkas .Rd di man/ dan menulis ulang NAMESPACE sesuai daftar ekspor, sehingga kedua berkas itu diperbarui ulang setiap kali kodenya berubah.

Ringkasan#

  • Paket adalah unit distribusi yang menyatukan fungsi, dokumentasi, dan metadata, dengan CRAN sebagai repositori resminya.
  • install.packages() memasang paket sekali per komputer, sedangkan library() melampirkannya ke sesi dan perlu diulang setiap sesi.
  • Instalasi dari GitHub menggunakan remotes::install_github() untuk versi pengembangan yang belum terbit di CRAN.
  • Paket mini terdiri atas DESCRIPTION untuk identitas, R/ untuk kode, NAMESPACE untuk daftar fungsi yang diekspor, dan man/ untuk dokumentasi yang dibangkitkan oleh devtools::document().

Referensi#