أدلة العمل ومسارات الملفات
استخدم getwd() وsetwd() وhere() لمسارات موثوقة عبر الأنظمة.
أدلة العمل ومسارات الملفات درس مجاني في R Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في R Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة R Academy 4 دروس في المجموع.
ما مجلد العمل؟
مجلد العمل هو المجلد الذي تستخدمه R كنقطة بداية عند الإشارة إلى الملفات باستخدام مسارات نسبية. وهو الموقع الافتراضي الذي تبحث فيه R (وتكتب إليه) عندما لا تقدم مسارًا كاملًا. لكل جلسة R مجلد عمل واحد بالضبط في أي وقت.
# getwd() returns the current working directory
current_dir <- getwd()
cat('Working directory:', current_dir)
# All relative file references start from this location:
# read.csv('data.csv') <- looks in current_dir/data.csv
# source('R/helpers.R') <- looks in current_dir/R/helpers.Rsetwd() — تغيير مجلد العمل
تغيّر setwd() مجلد العمل لجلسة R الحالية. وتعيد مجلد العمل السابق دون إظهاره، وهو ما يفيد في استعادة الحالة. ملاحظة: لا يُنصح باستخدام setwd() في البرامج النصية ضمن أساليب العمل القائمة على المشروعات.
# Set a new working directory
old_dir <- setwd('/tmp')
cat('Now in:', getwd(), '\n')
# Restore original directory
setwd(old_dir)
cat('Restored to:', getwd(), '\n')
# Common anti-pattern (breaks on other machines):
# setwd('/Users/alice/Desktop/my_project') <- hardcoded!
# Better: use RStudio Projects which set wd automaticallyfile.path() — إنشاء مسارات قابلة للنقل
تنشئ file.path() مسارات الملفات من خلال ضم المكونات باستخدام الفاصل الصحيح لنظام التشغيل (/ في Mac/Linux، و\ في Windows). استخدمها دائمًا بدلًا من ضم السلاسل النصية لضمان التوافق بين الأنظمة.
# Build a path from components
data_path <- file.path('data', 'raw', 'sales.csv')
cat('Path:', data_path)
# On Unix: data/raw/sales.csv
# On Windows: data\raw\sales.csv
# Multiple levels
output_file <- file.path('output', '2024', 'Q1', 'report.pdf')
cat('Output:', output_file)
# Combine with getwd() for a full absolute path
full_path <- file.path(getwd(), 'data', 'sales.csv')
cat('Full path:', full_path)normalizePath() — التحويل إلى مسار مطلق
تحوّل normalizePath() المسار النسبي إلى صيغته المطلقة المعتمدة، مع حل مكوّني . (المجلد الحالي) و.. (المجلد الأصلي). وهذا ضروري عندما تحتاج إلى تخزين موقع ملف واضح وغير ملتبس أو تسجيله.
# Resolve relative paths to absolute
abs_path <- normalizePath('.')
cat('Absolute cwd:', abs_path, '\n')
# Resolve a relative path
data_abs <- normalizePath(file.path('..', 'data', 'sales.csv'),
mustWork = FALSE)
cat('Resolved:', data_abs, '\n')
# mustWork = FALSE: do not error if file does not exist yet
# mustWork = TRUE (default): error if path does not exist
# Useful for building reliable log messages or config files
cat('normalizePath demo complete')dirname() وbasename()
تستخرج dirname() جزء المجلد من المسار، بينما تستخرج basename() جزء اسم الملف. وهاتان الدالتان هما النظيران في R لأمري shell في Unix، dirname وbasename.
path <- '/Users/alice/projects/analysis/data/sales_2024.csv'
# Extract the directory
folder <- dirname(path)
cat('Directory:', folder, '\n')
# /Users/alice/projects/analysis/data
# Extract the file name
filename <- basename(path)
cat('File name:', filename, '\n')
# sales_2024.csv
# Remove file extension
name_only <- tools::file_path_sans_ext(filename)
cat('Name only:', name_only)file.exists() — التحقق قبل القراءة
تحقق دائمًا من وجود الملف قبل محاولة قراءته لتجنب رسائل الخطأ الغامضة. تعيد file.exists() القيمة TRUE أو FALSE، وتعمل مع الملفات والمجلدات على حد سواء.
data_file <- file.path('data', 'sales.csv')
# Check existence before reading
if (file.exists(data_file)) {
cat('File found, loading...\n')
# df <- read.csv(data_file)
} else {
cat('File not found:', data_file, '\n')
stop('Cannot proceed without data file.')
}
# Check multiple files at once
files <- c('data/a.csv', 'data/b.csv', 'data/c.csv')
exists_vec <- file.exists(files)
cat('Files found:', sum(exists_vec), 'of', length(files))Sys.getenv() — مسارات متغيرات البيئة
تخزن متغيرات البيئة مسارات على مستوى النظام، مثل المجلد الرئيسي والمجلد المؤقت ومسارات التطبيقات المخصصة. تقرأ Sys.getenv() هذه القيم، مما يجعل شيفرتك قابلة للتكيف مع الأنظمة المختلفة من دون تثبيت المسارات داخلها.
# Get the home directory
home_dir <- Sys.getenv('HOME')
cat('Home:', home_dir, '\n')
# Get the temp directory
tmp_dir <- Sys.getenv('TMPDIR')
cat('Temp:', tmp_dir, '\n')
# Custom environment variable (set in .Renviron)
data_root <- Sys.getenv('DATA_ROOT', unset = '/default/data')
cat('Data root:', data_root, '\n')
# Use env vars to build portable paths
config_file <- file.path(home_dir, '.config', 'myapp', 'settings.json')
cat('Config path:', config_file)path.expand() — توسيع الرمز ~
يُستخدم الرمز ~ اختصارًا للمجلد الرئيسي في الأنظمة الشبيهة بـ Unix، لكن دوال الملفات في R لا توسّعه تلقائيًا دائمًا. تستبدل path.expand() الرمز ~ بالمسار الفعلي للمجلد الرئيسي.
# Expand tilde to full home path
short_path <- '~/.Rprofile'
full_path <- path.expand(short_path)
cat('Expanded:', full_path)
# e.g. /Users/alice/.Rprofile
# Useful when passing paths to external tools or logging
config_dir <- path.expand('~/.config/R')
cat('Config dir:', config_dir)
# Can expand multiple paths at once
paths <- c('~/data', '~/output', '~/scripts')
expanded <- path.expand(paths)
cat(expanded, sep = '\n')سرد الملفات باستخدام list.files()
تسرد list.files() (والاسم البديل لها dir()) الملفات الموجودة في مجلد، مع إمكانية تصفيتها اختياريًا حسب نمط وإرجاع المسارات الكاملة اختياريًا. وتُعد ضرورية عند الحاجة إلى معالجة عدة ملفات في مجلد.
# List all files in current directory
all_files <- list.files('.')
cat('Files found:', length(all_files), '\n')
# Filter by extension
csv_files <- list.files('data', pattern = '\\.csv$', full.names = TRUE)
cat('CSV files:', length(csv_files), '\n')
# Recursive: include subdirectories
r_files <- list.files('R', pattern = '\\.R$',
full.names = TRUE, recursive = TRUE)
cat('R scripts:', length(r_files))إنشاء المسارات وإزالتها
تحتوي R على دوال مضمّنة لإنشاء المجلدات وإدارة الملفات. استخدم dir.create() لإنشاء مجلدات جديدة، مع recursive = TRUE لإنشاء المسارات المتداخلة، واستخدم file.remove() لتنظيف الملفات المؤقتة.
# Create a directory (will not error if it already exists)
dir.create('output/figures', recursive = TRUE, showWarnings = FALSE)
cat('Directory created\n')
# Create a temporary file
tmp_file <- tempfile(fileext = '.csv')
write.csv(data.frame(x = 1:3), tmp_file, row.names = FALSE)
cat('Temp file:', tmp_file, '\n')
# Remove the file when done
if (file.remove(tmp_file)) {
cat('Temp file cleaned up')
}حزمة here — مسارات نسبية للمشروع
تحل حزمة here مشكلة مجلد العمل بطريقة أنيقة. تبني here::here() دائمًا المسارات نسبةً إلى جذر المشروع، حيث يوجد ملف .Rproj، بغض النظر عن موضع استدعائها داخل المشروع.
# install.packages('here')
# library(here)
# Always resolves from project root:
# here('data', 'raw', 'sales.csv')
# here('R', 'helpers.R')
# here('output', 'report.html')
# Without here: setwd() headaches when script is in a subfolder
# With here: same path works from any subfolder
# Demonstrate base-R equivalent approach:
project_root <- normalizePath(file.path(getwd(), '..'), mustWork = FALSE)
data_path <- file.path(project_root, 'data', 'sales.csv')
cat('Data path:', data_path)تحقق سريع
لديك سلسلة مسار 'data/raw/../clean/sales.csv'. ما الدالة التي ستستخدمها لتحويلها إلى مسار مطلق نظيف وقياسي؟
مسارات الملفات — أهم النقاط
يُعد التعامل المتين مع مسارات الملفات أمرًا ضروريًا لإنشاء نصوص R قابلة لإعادة الإنتاج:
getwd()/setwd()— الحصول على دليل العمل وتعيينهfile.path('a', 'b', 'c.csv')— إنشاء مسارات قابلة للنقل بين أنظمة التشغيلnormalizePath(path, mustWork = FALSE)— التحويل إلى مسار مطلقdirname()/basename()— تقسيم المسار إلى مجلد وملفfile.exists()— التحقق قبل القراءةSys.getenv('HOME')— الوصول إلى مسارات النظام عبر متغيرات البيئةpath.expand('~')— توسيع الرمز tilde إلى الدليل الرئيسيlist.files(pattern = '\.csv$')— العثور على الملفات حسب الامتدادdir.create(recursive = TRUE)— إنشاء مجلدات متداخلة بأمان- استخدم حزمة here للمسارات النسبية إلى المشروع في مشاريع RStudio
# Robust file loading pattern:
data_file <- file.path('data', 'raw', 'sales.csv')
if (!file.exists(data_file)) {
stop(paste('Missing file:', normalizePath(data_file, mustWork = FALSE)))
}
# df <- read.csv(data_file)
cat('File path:', data_file, '\n')
cat('Full path:', normalizePath(data_file, mustWork = FALSE))الأسئلة الشائعة
هل درس «أدلة العمل ومسارات الملفات» مجاني؟
نعم — نص درس «أدلة العمل ومسارات الملفات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة R Academy، انتقل إلى CoddyKit PRO. تتضمن دورة R Academy 4 دروس في المجموع.
ماذا ستتعلم في «أدلة العمل ومسارات الملفات»؟
استخدم getwd() وsetwd() وhere() لمسارات موثوقة عبر الأنظمة. تتمرن على R Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ R Academy؟
لا تُشترط خبرة سابقة. R Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «أدلة العمل ومسارات الملفات»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس R Academy هذا؟
نعم. كل درس في R Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- استخدام source() لتحميل السكربتات
- التعليقات والأسلوب وقابلية القراءة
- أدلة العمل ومسارات الملفات
- مشاريع R وإدارة مساحة العمل