Apa Itu Working Directory
Setiap sesi R berjalan "di dalam" tepat satu folder: working directory. Setiap kali kamu memakai path relatif, yaitu path yang tidak dimulai dari root sistem file, R menyelesaikannya terhadap folder itu. read.csv("data.csv") tidak berarti "cari data.csv di mana saja di komputerku"; artinya "buka file bernama data.csv di working directory".
Satu fakta ini menjelaskan error pemula yang paling umum di R:
read.csv("data.csv")
# Error in file(file, "rt") : cannot open the connection
# In addition: Warning message: cannot open file 'data.csv': No such file or directory
File-nya ada, hanya saja tidak di folder yang sedang dilihat R. Tidak ada yang salah dengan panggilan read.csv milikmu; working directory sesi itu dan lokasi file-nya tidak sejalan. Dua fungsi di bawah ini mengubah misteri itu menjadi diagnosis sepuluh detik.
getwd() dan setwd()
getwd() (get working directory) memberi tahu di mana R sedang mencari saat ini:
Jalankan, dan kamu akan melihat path absolut, yaitu folder tempat sesi ini berpijak. setwd() (set working directory) mengubahnya:
setwd("C:/Users/rosa/projects/sales-analysis") # Windows: use / not \
setwd("/Users/rosa/projects/sales-analysis") # macOS / Linux
getwd() # confirm it took
Ada dua catatan teknis. Di Windows, tulis path dengan / (atau \\ ganda): satu \ adalah karakter escape di dalam string R, jadi "C:\Users" adalah error sintaks. Dan setwd() langsung menghasilkan error kalau foldernya tidak ada, kegagalan paling ramah yang akan kamu temui seharian: ia tidak bisa membiarkanmu diam-diam menunjuk ke tempat yang salah.
Karena itu, rutinitas debugging untuk setiap error "cannot open file" adalah: getwd() untuk melihat di mana R mencari, lalu bandingkan dengan lokasi file yang sebenarnya.
list.files(): Lihat Apa yang Dilihat R
Alat ketiga di perangkat ini mendaftar isi working directory, secara harfiah kumpulan nama yang bisa dijangkau oleh path relatif:
Kalau file yang ingin kamu baca muncul di output itu, read.csv("thatfile.csv") akan menemukannya. Kalau tidak, mengetik ulang baris read.csv berapa kali pun tidak akan membantu: working directory-lah yang perlu diperbaiki. list.files("data") mengintip ke dalam subfolder, dan list.files(pattern = "\\.csv$") hanya menyaring file CSV. Ketika nama file terlihat benar tetapi tidak ditemukan, list.files() juga membongkar penyebab klasiknya: ekstensi .txt tak terlihat yang ditambahkan oleh editor teks, atau Data.csv vs data.csv di sistem yang case sensitive.
Kenapa setwd() yang Ditulis Mati Itu Rusak
Sekarang bagian yang beropini. Kamu akan melihat script yang dibuka dengan:
setwd("C:/Users/me/Desktop/stuff/project3/final_FINAL")
Baris itu hanya berfungsi di tepat satu komputer: milik penulisnya. Di laptopmu, Mac rekan kerjamu, server departemen, atau komputermu sendiri setelah folder-foldernya ditata ulang, baris itu menghasilkan error di baris 1. Menulis mati path absolut sama dengan menanamkan susunan folder satu orang ke dalam kode yang seharusnya bertahan lebih lama dari susunan itu.
Solusinya adalah membalik tanggung jawabnya: jangan buat script mencari folder, tetapi mulai R di folder yang benar, dan pakai path relatif di dalam script. Secara konkret:
- Pakai RStudio Project. Membuka file
.Rprojmengatur working directory ke folder project secara otomatis, di komputer mana pun. Di dalam script,read.csv("data/sales.csv")lalu berfungsi bagi semua orang yang punya project itu. - Menjalankan dari terminal melakukan tugas yang sama:
Rscript analysis.Rmemakai folder tempat kamu menjalankannya sebagai working directory (lihat menjalankan script R). - Package here melangkah lebih jauh bagi yang menginginkannya:
here::here("data", "sales.csv")membangun path dari root project, ke mana pun working directory berkelana. Tetapi Project plus path relatif sudah mencukupi sebagian besar kebutuhan tanpa package itu.
setwd() sendiri tidak jahat: ia baik-baik saja saat dipakai secara interaktif, saat bereksplorasi. Yang bermasalah secara khusus adalah setwd() absolut yang terikat pada satu komputer dan ditaruh di bagian atas script yang dibagikan.
Workspace: ls() dan rm()
Di samping "aku sedang di folder mana", ada state sesi bagian kedua: workspace (global environment), yaitu setiap objek yang sudah kamu buat di sesi ini. ls() mendaftarnya, rm() menghapusnya:
ls() terakhir mencetak character(0), yaitu workspace yang kosong. Mantra rm(list = ls()) terbaca aneh sampai kamu menguraikannya: ls() mengembalikan vector character berisi semua nama objek, dan rm(list = ...) menghapus setiap nama di vector itu. Ini padanan kode untuk ikon sapu di panel Environment RStudio.
Ketahui apa yang tidak dilakukannya: package yang dimuat dengan library() tetap dimuat, opsi tetap diatur, dan working directory tetap di tempatnya. Ia hanya membersihkan objek, tidak lebih, jadi ini bukan pengganti memulai ulang R ketika kamu ingin benar-benar mulai dari nol.
Membersihkan Console, dan Jebakan .RData
Membersihkan console, yaitu riwayat perintah dan output, hanya soal tampilan dan terpisah dari membersihkan workspace. Di RStudio caranya Ctrl+L; di kode, cat("\014") yang unik itu mengirim karakter form-feed, yang ditafsirkan sebagian besar console sebagai "bersihkan layar". Tidak satu pun dari keduanya menyentuh objekmu.
Terakhir, jebakannya. Saat kamu keluar dari R, ia menawarkan "save workspace image?", yaitu menulis setiap objek ke file .RData tersembunyi yang diam-diam dimuat ulang saat kamu membuka R di folder itu lagi. Tolak, dan matikan secara permanen (RStudio: Tools → Global Options → hapus centang "Restore .RData", atur "Save workspace" ke Never). Workspace yang dipulihkan berarti sesimu dimulai dalam keadaan tercemar oleh objek dari beberapa hari lalu, yang dibuat oleh kode yang mungkin sudah kamu edit atau hapus. Script-mu terlihat berfungsi, karena bersandar pada model_v2 basi yang tidak lagi dibuat oleh apa pun di file itu, sampai suatu saat ia dijalankan di komputer yang bersih dan runtuh.
Kebiasaan profesionalnya justru sebaliknya: mulai dari bersih, lalu jalankan ulang script-nya. Kalau analisismu berupa script yang berjalan dari atas sampai bawah di sesi baru, ia reproducible sejak awal; workspace adalah output yang bisa dibuang, bukan state yang berharga. Sering-seringlah memulai ulang R (RStudio: Session → Restart R) justru untuk membuktikan bahwa script-mu masih bisa berdiri sendiri.
Yang Perlu Kamu Ingat
- Path relatif diselesaikan terhadap working directory;
getwd()menampilkannya,setwd()mengubahnya,list.files()menampilkan apa yang bisa dijangkau. - "Cannot open file" hampir selalu berarti working directory dan folder file-nya tidak sejalan; diagnosis dengan
getwd()+list.files(). - Jangan pernah menaruh
setwd()absolut di script yang dibagikan; pakai RStudio Project (atau jalankan script dari folder-nya) dan path relatif. ls()mendaftar objek di workspace;rm(x)menghapus satu;rm(list = ls())menghapus semuanya, sementara package dan opsi tetap ada.- Ctrl+L (atau
cat("\014")) hanya membersihkan teks di console. - Jangan menyimpan/memulihkan
.RDatasecara otomatis: mulai dari bersih dan jalankan ulang script-nya, itulah yang membuat pekerjaanmu reproducible.
Berikutnya: membaca data sungguhan, yaitu read.csv() dan kawan-kawannya, sekarang setelah R mencari di folder yang benar.
Pertanyaan yang sering diajukan
Bagaimana cara mengatur working directory di R?
Panggil setwd("path/to/folder") untuk mengubahnya dan getwd() untuk melihat yang sedang aktif. Di RStudio kamu juga bisa memakai menu: Session → Set Working Directory. Tetapi untuk apa pun yang akan kamu jalankan ulang atau bagikan, lebih baik pakai RStudio Project (yang mengatur working directory secara otomatis) daripada baris setwd() yang ditulis mati, karena path absolut akan rusak di setiap komputer lain.
Bagaimana cara membersihkan environment di R?
rm(list = ls()) menghapus setiap objek dari global environment: ls() mendaftar semua nama objek dan rm() menghapusnya. Untuk menghapus satu objek saja, pakai rm(x). Perhatikan bahwa ini hanya membersihkan objek: package yang sudah dimuat tetap dimuat, dan teks di console tidak tersentuh (untuk itu pakai Ctrl+L di RStudio).
Kenapa read.csv bilang 'cannot open file' padahal file-nya ada?
Karena R menyelesaikan path relatif terhadap working directory-nya, dan working directory-mu menunjuk ke tempat lain, bukan ke folder yang berisi file itu. Jalankan getwd() untuk melihat di mana R mencari dan list.files() untuk melihat apa yang bisa ia lihat di sana. Perbaiki dengan membuka project di folder yang benar (atau setwd()), bukan dengan menempelkan path absolut ke dalam script.