Menu

R'de Çalışma Dizini: setwd(), getwd() ve Çalışma Alanını Temizleme

R'nin dosyaları nerede aradığı ve bunu nasıl denetleyeceğiniz: getwd(), setwd(), list.files(), rm(list = ls()) ile ortamı temizleme ve .RData otomatik kaydının neden bir tuzak olduğu.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

Çalışma Dizini Nedir

Her R oturumu tam olarak tek bir klasörün "içinde" çalışır: çalışma dizini. Göreli bir yol kullandığınızda - dosya sisteminin kökünden başlamayan bir yol - R onu o klasöre göre çözer. read.csv("data.csv"), "bilgisayarımda bir yerlerde data.csv dosyasını bul" demek değildir; "çalışma dizinindeki data.csv adlı dosyayı aç" demektir.

Bu tek olgu, R'deki en yaygın acemi hatasını açıklar:

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

Dosya var - yalnızca R'nin şu an baktığı klasörde değil. read.csv çağrınızda yanlış bir şey yok; oturumun çalışma dizini ile dosyanın konumu uyuşmuyor. Aşağıdaki iki fonksiyon bunu bir gizemden on saniyelik bir teşhise dönüştürür.

getwd() ve setwd()

getwd() (get working directory), R'nin şu anda nereye baktığını söyler:

Bunu çalıştırın; mutlak bir yol görürsünüz - bu oturumun demir attığı klasör. setwd() (set working directory) onu değiştirir:

setwd("C:/Users/rosa/projects/sales-analysis")   # Windows: use / not \
setwd("/Users/rosa/projects/sales-analysis")     # macOS / Linux
getwd()                                          # confirm it took

İki mekanik not. Windows'ta yolları / (ya da ikilenmiş \\) ile yazın - tek bir \, R metinlerinin içinde bir kaçış karakteridir, dolayısıyla "C:\Users" bir söz dizimi hatasıdır. Ve klasör yoksa setwd() anında hata verir; bu, gün boyu alacağınız en dostane başarısızlıktır: sizi sessizce yanlış yere yönlendirmiş hâlde bırakamaz.

Dolayısıyla her "cannot open file" hatası için hata ayıklama rutini şudur: R'nin nereye baktığını görmek için getwd(), sonra bunu dosyanın gerçekte yaşadığı yerle karşılaştırın.

list.files(): R'nin Gördüğünü Görün

Takımdaki üçüncü araç, çalışma dizininin içeriğini listeler - harfiyen göreli bir yolun ulaşabileceği isimler kümesini:

Okumaya çalıştığınız dosya o çıktıda görünüyorsa read.csv("thatfile.csv") onu bulacaktır. Görünmüyorsa, read.csv satırını ne kadar yeniden yazarsanız yazın işe yaramaz - düzeltilecek şey çalışma dizinidir. list.files("data") bir alt klasöre göz atar ve list.files(pattern = "\\.csv$") yalnızca CSV'lere filtreler. Bir dosya adı doğru göründüğü hâlde bulunamadığında list.files(), klasik suçluları da açığa çıkarır: bir metin düzenleyicinin eklediği görünmez bir .txt uzantısı ya da büyük/küçük harfe duyarlı bir sistemde Data.csv ile data.csv farkı.

Sabit Kodlanmış setwd() Neden Bozulur

Şimdi görüşlü kısım. Şununla açılan betikler göreceksiniz:

setwd("C:/Users/me/Desktop/stuff/project3/final_FINAL")

O satır tam olarak tek bir makinede çalışır: yazarınkinde. Sizin dizüstünüzde, meslektaşınızın Mac'inde, bölüm sunucusunda ya da bir düzenlemeden sonra kendi bilgisayarınızda 1. satırda hata verir. Mutlak bir yolu sabit kodlamak, bir kişinin klasör düzenini onu aşmak üzere yazılmış bir koda gömer.

Çözüm, sorumluluğu tersine çevirmektir: betiğin klasörü bulmasını beklemeyin - R'yi doğru klasörde başlatın ve betiğin içinde göreli yollar kullanın. Somut olarak:

  • RStudio Projeleri kullanın. Bir .Rproj dosyasını açmak, çalışma dizinini her makinede otomatik olarak proje klasörüne ayarlar. Betiğin içinde read.csv("data/sales.csv") o zaman projeye sahip olan herkes için çalışır.
  • Bir terminalden çalıştırmak aynı işi görür: Rscript analysis.R, onu başlattığınız klasörü çalışma dizini olarak kullanır (bkz. R betiklerini çalıştırma).
  • here paketi isteyenler için bir adım öteye gider - here::here("data", "sales.csv"), çalışma dizini nereye savrulmuş olursa olsun yolları proje kökünden kurar - ama Projeler artı göreli yollar çoğu ihtiyacı onsuz karşılar.

setwd() kendi başına kötü değildir - keşif yaparken, etkileşimli olarak gayet iyidir. Kötü koku, özellikle paylaşılan bir betiğin en üstüne işlenmiş mutlak ve makineye özgü bir setwd() çağrısıdır.

Çalışma Alanı: ls() ve rm()

"Hangi klasördeyim" sorusunun yanında oturum durumunun ikinci parçası durur: çalışma alanı (global ortam) - bu oturumda oluşturduğunuz her nesne. ls() onları listeler, rm() siler:

Son ls() character(0) yazdırır - boş bir çalışma alanı. rm(list = ls()) büyüsü, çözümleyene kadar tuhaf okunur: ls() tüm nesne adlarının character vektörünü döndürür ve rm(list = ...) o vektördeki her ismi siler. RStudio'nun Environment panelindeki süpürge simgesinin kod karşılığıdır.

Ne yapmadığını bilin: library() ile yüklenen paketler yüklü kalır, seçenekler ayarlı kalır ve çalışma dizini yerinde durur. Yalnızca nesneleri temizler, başka bir şeyi değil - dolayısıyla gerçekten temiz bir sayfa istediğinizde R'yi yeniden başlatmanın yerini tutmaz.

Konsolu Temizlemek ve .RData Tuzağı

Konsolu temizlemek - komut ve çıktı geçmişini - kozmetiktir ve çalışma alanını temizlemekten ayrıdır. RStudio'da Ctrl+L'dir; kodda ise tuhaf cat("\014"), çoğu konsolun "ekranı temizle" olarak yorumladığı form-feed karakterini gönderir. Hiçbiri nesnelerinize dokunmaz.

Son olarak tuzak. R'den çıktığınızda "save workspace image?" diye sorar - her nesneyi gizli bir .RData dosyasına yazar ve bu dosya, o klasörde R'yi bir dahaki başlatışınızda sessizce yeniden yüklenir. Reddedin ve kalıcı olarak kapatın (RStudio: Tools → Global Options → "Restore .RData" işaretini kaldırın, "Save workspace" ayarını Never yapın). Geri yüklenen bir çalışma alanı, oturumunuzun günler öncesinden kalma, o zamandan beri düzenlemiş ya da silmiş olabileceğiniz kodla oluşturulmuş nesnelerle kirli başlaması demektir. Betiğiniz çalışıyor gibi görünür - çünkü dosyadaki hiçbir şeyin artık oluşturmadığı bayat bir model_v2 nesnesine yaslanmaktadır - ta ki temiz bir makinede çalışıp çökene kadar.

Profesyonel alışkanlık bunun tersidir: temiz başlayın ve betiği yeniden çalıştırın. Analiziniz taze bir oturumda yukarıdan aşağıya çalışan bir betikse, yapısı gereği yeniden üretilebilirdir; çalışma alanı atılabilir bir çıktıdır, asla kıymetli bir durum değil. Betiğinizin hâlâ kendi ayakları üzerinde durduğunu kanıtlamak için R'yi sık sık yeniden başlatın (RStudio: Session → Restart R).

Buradan Ne Çıkarıyorsunuz

  • Göreli yollar çalışma dizinine göre çözülür; getwd() onu gösterir, setwd() değiştirir, list.files() neye ulaşılabildiğini gösterir.
  • "Cannot open file" neredeyse her zaman çalışma dizini ile dosyanın klasörünün uyuşmadığı anlamına gelir - getwd() + list.files() ile teşhis edin.
  • Paylaşılan bir betiğe asla mutlak bir setwd() işlemeyin - RStudio Projeleri (ya da betiği kendi klasöründen çalıştırmayı) ve göreli yolları kullanın.
  • ls() çalışma alanı nesnelerini listeler; rm(x) bir tanesini siler; rm(list = ls()) hepsini temizler - paketler ve seçenekler kalır.
  • Ctrl+L (ya da cat("\014")) yalnızca konsol metnini temizler.
  • .RData dosyasını otomatik kaydetmeyin/geri yüklemeyin: temiz başlayın ve betiği yeniden çalıştırın - işinizi yeniden üretilebilir kılan şey budur.

Sırada: gerçek veriyi okumak - artık R doğru klasöre baktığına göre read.csv() ve arkadaşları.

Sıkça Sorulan Sorular

R'de çalışma dizinini nasıl ayarlarım?

Değiştirmek için setwd("path/to/folder"), mevcut olanı görmek için getwd() çağırın. RStudio'da menüyü de kullanabilirsiniz: Session → Set Working Directory. Ama yeniden çalıştıracağınız ya da paylaşacağınız her şey için, sabit kodlanmış bir setwd() satırı yerine çalışma dizinini otomatik ayarlayan bir RStudio Projesi tercih edin - mutlak yollar diğer her makinede bozulur.

R'de ortamı nasıl temizlerim?

rm(list = ls()), global ortamdaki her nesneyi kaldırır: ls() tüm nesne adlarını listeler ve rm() onları siler. Yalnızca bir nesneyi silmek için rm(x) kullanın. Bunun yalnızca nesneleri temizlediğine dikkat edin - yüklü paketler yüklü kalır ve konsol metnine dokunulmaz (o RStudio'da Ctrl+L'dir).

Dosya var olduğu hâlde read.csv neden 'cannot open file' diyor?

Çünkü R göreli yolları çalışma dizinine göre çözer ve sizinki dosyayı barındıran klasörden başka bir yere işaret ediyor. R'nin nereye baktığını görmek için getwd(), orada ne görebildiğini görmek için list.files() çalıştırın. Bunu betiğe mutlak bir yol yapıştırarak değil, projeyi doğru klasörde açarak (ya da setwd() ile) düzeltin.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA