Vektor menyimpan banyak nilai, tetapi semuanya harus bertipe sama. Apabila satu objek perlu memuat campuran data, misalnya nama berbentuk teks, sekumpulan angka nilai, dan penanda logika, satu vektor tidak lagi cukup. List adalah wadah generik di R yang menampung elemen dari tipe apa pun, termasuk list lain di dalamnya. Topik ini membahas cara membuat list, menamai elemennya, mengakses isi yang bersarang, mengubah isinya, serta membaca strukturnya dengan fungsi str().
Membuat dan mengamati list#
Fungsi list() membentuk list dari argumen-argumennya, yaitu satu argumen menjadi satu elemen. Elemen dapat diberi nama saat pembuatan dengan bentuk nama = nilai, dan nama inilah yang digunakan untuk mengaksesnya nanti. Contoh berikut menyusun profil satu siswa yang berisi teks dan vektor angka.
siswa <- list(nama = "Ali", kelas = "11A", nilai = c(80, 85, 78))
siswa$nama
[1] "Ali"
$kelas
[1] "11A"
$nilai
[1] 80 85 78List yang ditampilkan memunculkan setiap elemen dengan tanda $ dan namanya, lalu isi elemen tersebut persis seperti vektor biasa. Jumlah elemen dihitung dengan length(). Struktur list diperiksa dengan str() (structure), yang menampilkan tipe dan panjang setiap elemen secara ringkas.
length(siswa)
str(siswa)[1] 3
List of 3
$ nama : chr "Ali"
$ kelas: chr "11A"
$ nilai: num [1:3] 80 85 78Tanda chr dan num pada keluaran str() menunjukkan tipe elemen, yaitu character dan numeric. List tanpa nama elemen juga sah dibuat, dan str() menandai posisinya dengan $ tanpa nama. Pada list berikut, ketiga elemennya bertipe berbeda, sesuatu yang tidak mungkin disatukan dalam satu vektor atomik (atomic vector) karena vektor atomik selalu memaksa satu tipe bagi seluruh isinya.
campuran <- list(80, "Ali", TRUE)
str(campuran)List of 3
$ : num 80
$ : chr "Ali"
$ : logi TRUEMenyusun list bersarang#
Elemen sebuah list boleh berupa list lain, sehingga struktur bertingkat dapat disusun untuk data yang memang bertingkat, misalnya satu kelas yang memuat profil siswanya. Contoh berikut membungkus list siswa ke dalam list kelas, lengkap dengan wali kelas, tahun ajaran, dan penanda status aktif.
kelas <- list(
wali = "Bu Sari",
tahun_ajaran = "2025/2026",
aktif = TRUE,
siswa = siswa
)
kelas$wali
[1] "Bu Sari"
$tahun_ajaran
[1] "2025/2026"
$aktif
[1] TRUE
$siswa
$siswa$nama
[1] "Ali"
$siswa$kelas
[1] "11A"
$siswa$nilai
[1] 80 85 78Keluarannya memperlihatkan elemen siswa yang isinya list lagi, lengkap dengan $siswa$nama dan seterusnya. Struktur bertingkat seperti ini muncul di banyak tempat pada R. Fungsi pemodelan seperti lm(), misalnya, mengembalikan satu objek list yang memuat koefisien, residual, dan berbagai informasi lain dalam satu wadah.
Mengakses elemen dengan $ dan [[ ]]#
Elemen bernama diakses dengan tanda $ atau dengan `[["nama"]]`. Keduanya mengembalikan isi elemen, bukan wadahnya, sehingga hasilnya dapat langsung diindeks lagi seperti pada siswa$nilai[2].
kelas$wali
kelas[["tahun_ajaran"]]
siswa$nilai[2][1] "Bu Sari"
[1] "2025/2026"
[1] 85Elemen bersarang dijangkau dengan menyambung aksesnya, baik lewat tanda $ beruntun maupun lewat [[ yang diulang untuk setiap tingkatnya.
kelas$siswa$nama
kelas[["siswa"]][["nilai"]][1] "Ali"
[1] 80 85 78Perbedaan penting terletak pada tanda kurung tunggal. Ekspresi siswa[1] mengambil elemen pertama, tetapi hasilnya tetap dibungkus sebagai list, sedangkan siswa[[1]] mengeluarkan isinya. Fungsi str() memperlihatkan perbedaan kelas keduanya.
siswa[1]
siswa[[1]]
str(siswa[1])
str(siswa[[1]])$nama
[1] "Ali"
[1] "Ali"
List of 1
$ nama: chr "Ali"
chr "Ali"Hasil siswa[1] berupa List of 1 yang masih perlu dibuka dengan [[, sedangkan siswa[[1]] langsung berupa teks "Ali". Kaidahnya berlaku umum: tanda kurung tunggal selalu mengembalikan wadah yang sama jenisnya, sedangkan [[ dan $ mengembalikan satu isi.
Mengubah, menambah, dan menghapus elemen#
Mengubah isi list dilakukan dengan penugasan ke elemen yang dituju. Apabila namanya sudah ada, nilai lamanya diganti, dan apabila belum ada, elemen baru ditambahkan di bagian akhir list.
siswa$umur <- 16
siswa$nilai <- siswa$nilai + 2
siswa$nama
[1] "Ali"
$kelas
[1] "11A"
$nilai
[1] 82 87 80
$umur
[1] 16Panjang list bertambah otomatis setelah elemen baru ditugaskan. Untuk menghapus elemen, cukup tugaskan NULL ke elemen tersebut.
siswa$umur <- NULL
siswa$nama
[1] "Ali"
$kelas
[1] "11A"
$nilai
[1] 82 87 80Elemen umur hilang dan panjang list kembali menjadi tiga. Penggantian menurut posisi juga sah dilakukan, misalnya siswa[[2]] <- "12A", meskipun penugasan menurut nama lebih aman dibaca karena maknanya jelas.
Kesalahan umum#
Dua perilaku sering mengejutkan saat mengakses list. Yang pertama, nama yang tidak ada tidak memunculkan error, melainkan NULL. Perilaku ini berlaku baik lewat $ maupun lewat `[["nama"]]`.
siswa$nimNULLsiswa[["nim"]]NULLPerilaku kedua adalah indeks posisi di luar rentang, yang memang menghasilkan error.
siswa[[99]]Error in siswa[[99]] : subscript out of boundsPesan subscript out of bounds berarti posisi yang diminta tidak tersedia. R sengaja menangani kedua kasus ini secara berbeda, sehingga hasil NULL maupun pesan error perlu dikenali agar sumber masalahnya cepat ditemukan.
Ringkasan#
- List menampung elemen dari tipe apa pun, termasuk list lain, sehingga cocok untuk data yang tidak seragam.
- Elemen bernama diakses dengan
$atau`[["nama"]]`, dan keduanya mengembalikan isi elemen, bukan wadahnya. - Tanda kurung tunggal
[mengembalikan list baru, sehinggasiswa[1]masih berupa list sedangkansiswa[[1]]berupa isinya. - Penugasan ke nama baru menambah elemen, dan penugasan
NULLmenghapus elemen. - Nama yang tidak ada mengembalikan
NULLtanpa pesan error, sedangkan posisi di luar rentang menghasilkan errorsubscript out of bounds.
Referensi#
- An Introduction to R — CRAN — bagian Lists and data frames membahas pembuatan list, penamaan elemen, dan pengindeksannya.
- R for Data Science, edisi ke-2 — Wickham, Çetinkaya-Rundel, Grolemund — mencakup vektor dan list sebagai fondasi struktur data R.