مشاريع R وإدارة مساحة العمل
أنشئ مشاريع RStudio وأدر .RData و.Rhistory و.Renviron.
مشاريع R وإدارة مساحة العمل درس مجاني في R Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في R Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة R Academy 4 دروس في المجموع.
مساحة عمل R: .RData و.Rhistory
افتراضيًا، عند إنهاء R، سيطلب منك حفظ مساحة العمل — أي جميع الكائنات الموجودة في الذاكرة — في ملف مخفي يُسمى .RData داخل دليل العمل. ويُحفظ سجل أوامرك في .Rhistory. وتُحمَّل هذه الملفات تلقائيًا في الجلسة التالية.
لكن هذه الراحة قد تؤدي أيضًا إلى مشكلة في قابلية إعادة الإنتاج.
# .RData: binary snapshot of all objects in the global environment
# .Rhistory: text file of every command you typed
# See what would be saved right now:
cat('Objects that would be saved:', length(ls()), '\n')
cat('Their names:', paste(ls(), collapse = ', '))
# Workspace saving is controlled by:
# Tools -> Global Options -> General -> Save workspace (NEVER recommended)
# Or at startup: R --no-save --no-restoreلماذا نتجنب الحفظ التلقائي لـ .RData؟
الاعتماد على .RData يعني أنه لا يمكن إعادة إنتاج نتائجك من البداية. إذ تتراكم الكائنات دون أن تلاحظ ذلك عبر الجلسات، وقد تحجب المتغيرات القديمة المتغيرات الجديدة، كما يتعذر على المتعاونين إعادة إنشاء بيئتك. والحل هو: عدم حفظ مساحة العمل مطلقًا — بل إعادة إنشائها دائمًا بتشغيل نصوصك البرمجية.
# The recommended R startup setting (in RStudio):
# Tools -> Global Options -> General
# Restore .RData at startup: UNCHECKED
# Save workspace on exit: NEVER
# This forces you to write scripts that are fully self-contained.
# A fresh session that runs cleanly = reproducible analysis.
# Equivalent command-line flags:
# R --no-save --no-restore
cat('Always start fresh!')rm() — مسح مساحة العمل
تُعد rm(list = ls()) الطريقة القياسية لإزالة جميع الكائنات من البيئة العامة، ومحاكاة جلسة جديدة من دون إعادة تشغيل R. وغالبًا ما توضع في بداية النص البرمجي لضمان البدء ببيئة نظيفة في كل تشغيل.
# Create some objects
a <- 1
b <- 'hello'
df <- data.frame(x = 1:3)
cat('Before rm:', length(ls()), 'objects\n')
# Remove specific objects
rm(a, b)
cat('After rm(a,b):', length(ls()), 'objects\n')
# Remove ALL objects in global environment
rm(list = ls())
cat('After rm(list=ls()):', length(ls()), 'objects')options() — إعدادات الجلسة العامة
تتحكم options() في العديد من سلوكيات جلسة R بأكملها. ومن أكثر الخيارات شيوعًا scipen (عقوبة استخدام الصيغة العلمية) وdigits (عدد الأرقام المهمة المطبوعة). اضبطها في بداية النصوص البرمجية لضمان اتساق المخرجات.
# Default behavior:
cat(0.000123456, '\n') # may show 1.23456e-04
# Suppress scientific notation (positive scipen = prefer fixed)
options(scipen = 999)
cat(0.000123456, '\n') # now shows 0.000123456
# Control printed digits
options(digits = 4)
cat(pi, '\n') # 3.142
# Check current options:
cat('scipen:', getOption('scipen'), '\n')
cat('digits:', getOption('digits')).Renviron — متغيرات البيئة
يخزن ملف .Renviron متغيرات البيئة التي يحمّلها R عند بدء التشغيل. وهو المكان المناسب لـالأسرار وقيم الإعداد مثل مفاتيح API وكلمات مرور قواعد البيانات ومسارات نظام الملفات، مما يبقيها خارج الشفرة المصدرية.
# .Renviron file (in ~ or project root):
# DATABASE_URL=postgres://user:pass@host/db
# OPENAI_API_KEY=sk-abc123
# DATA_ROOT=/data/shared
# Read in R:
db_url <- Sys.getenv('DATABASE_URL')
api_key <- Sys.getenv('OPENAI_API_KEY', unset = 'KEY_NOT_SET')
cat('DB URL set:', nchar(db_url) > 0, '\n')
cat('API key:', api_key)
# To edit .Renviron:
# usethis::edit_r_environ() <- if usethis is installed
# file.edit('~/.Renviron') <- base RsaveRDS() — حفظ كائن واحد
تعمل saveRDS() على تسلسل كائن R واحد وحفظه في ملف .rds. وهي الطريقة المفضلة لتخزين نتائج العمليات الحسابية المكلفة مؤقتًا، لأن الملف يخزن كائنًا واحدًا بالضبط، كما تتحكم أنت تحديدًا فيما تحفظه وتحمّله.
# Create an object to save
result_list <- list(
model = 'linear_regression',
r2 = 0.87,
rmse = 12.4,
created = Sys.time()
)
# Save to disk
tmp_rds <- tempfile(fileext = '.rds')
saveRDS(result_list, file = tmp_rds)
cat('Saved to:', tmp_rds, '\n')
# Load it back (even in a fresh session)
loaded <- readRDS(tmp_rds)
cat('R-squared:', loaded$r2)readRDS() — استعادة كائن واحد
تفكك readRDS() تسلسل ملف .rds وتعيده إلى كائن R. وعلى خلاف load()، يجب إسناد القيمة المُعادة إلى اسم، ولذلك يمكنك تحميل الملف نفسه بأسماء مختلفة في أجزاء مختلفة من شفرتك.
# Suppose model_results.rds was saved earlier
tmp <- tempfile(fileext = '.rds')
saveRDS(list(coef = c(1.2, 3.4), n = 100), tmp)
# Load with a meaningful name:
model_output <- readRDS(tmp)
cat('Coefficients:', model_output$coef, '\n')
cat('Sample size:', model_output$n, '\n')
# Key advantage over load():
# With load(), the name is baked into the file.
# With readRDS(), YOU choose the name on load.
cat('readRDS gives you naming control')save() وload() — كائنات متعددة
تعمل save() على تسلسل كائن واحد أو أكثر من الكائنات المسماة وحفظها في ملف .RData. وتستعيدها load()، لكن الأسماء الأصلية تُستعاد تلقائيًا، مما قد يؤدي بصمت إلى استبدال الكائنات الموجودة. استخدمهما بحذر.
# Save multiple objects at once
scores <- c(85, 92, 78)
labels <- c('Alice', 'Bob', 'Carol')
tmp_rdata <- tempfile(fileext = '.RData')
save(scores, labels, file = tmp_rdata)
cat('Saved to:', tmp_rdata, '\n')
# Remove originals to simulate a new session
rm(scores, labels)
cat('Removed. Objects now:', length(ls()), '\n')
# Load restores original names automatically
load(tmp_rdata)
cat('Restored scores:', scores)saveRDS مقابل save — متى نستخدم كلًا منهما؟
استخدم saveRDS() للكائنات المفردة عندما تريد التحكم الكامل في التسمية عند التحميل — وهذا مثالي لمخرجات النماذج ومجموعات البيانات المعالجة والنتائج المخزنة مؤقتًا. ولا تستخدم save() إلا عندما تحتاج إلى تجميع عدة كائنات مسماة معًا ضمن سير عمل محدد مع أحد المتعاونين.
# saveRDS: one object, you name it on load
# saveRDS(my_model, 'outputs/model_v2.rds')
# m <- readRDS('outputs/model_v2.rds') <- your name choice
# save: multiple objects, names fixed in the file
# save(model, validation_df, file = 'outputs/session.RData')
# load('outputs/session.RData') <- restores 'model' and 'validation_df'
# Practical rule:
# saveRDS for caching single results
# save for snapshots shared between collaborators
cat('saveRDS is usually the better choice')التحقق من options() واستعادتها
تستمر الخيارات التي تُضبط أثناء الجلسة لهذه الجلسة فقط. ولضمان استقلالية النص البرمجي، اضبط الخيارات التي تحتاج إليها في بدايته، واستعد القيم القديمة اختياريًا عند انتهاء النص البرمجي باستخدام on.exit().
# Capture current options before changing
old_options <- options(scipen = 999, digits = 3)
# Use on.exit to restore them no matter what
on.exit(options(old_options), add = TRUE)
# Now do your work
cat(pi, '\n') # 3.14
cat(1234567.89, '\n') # 1234568 (no sci notation)
# When function or script exits, options are restored automatically
cat('Options will restore on exit')مشاريع RStudio لإدارة مساحة العمل
يعيّن مشروع RStudio (ملف .Rproj) دليل العمل تلقائيًا إلى جذر المشروع، ويحافظ على ملف .Rhistory منفصل لكل مشروع، ويعزل خيارات الجلسة. وهذه هي الطريقة القياسية لإدارة مشاريع R المستقلة.
# When you open a .Rproj file, RStudio automatically:
# 1. Sets working directory to the project root
# 2. Loads the project-specific .Rhistory
# 3. Optionally restores project .RData
# Best practice for new projects:
# File -> New Project -> New Directory -> New Project
# Your project structure then looks like:
# my_project/
# my_project.Rproj
# .Rprofile (project-level options)
# .Renviron (project-level env vars)
# R/ (scripts)
# data/ (raw data)
# output/ (results)
cat('RStudio Projects = clean workspaces')تحقق سريع
تريد حفظ إطار بيانات R واحد يُسمى clean_data على القرص، بحيث تتمكن من إعادة تحميله في نص برمجي آخر باستخدام أي اسم متغير تختاره. ما الدالة التي ينبغي أن تستخدمها؟
إدارة مساحة العمل — أهم النقاط
تُعد مساحة عمل R المُدارة جيدًا أساس التحليل القابل لإعادة الإنتاج:
.RData/.Rhistory— ملفات مساحة العمل المحفوظة تلقائيًا (عطّل الحفظ التلقائي!)rm(list = ls())— مسح جميع الكائنات للبدء ببيئة نظيفةoptions(scipen = 999, digits = 4)— التحكم في تنسيق الأرقام.Renviron— تخزين مفاتيح API والمسارات كمتغيرات بيئةsaveRDS(obj, 'file.rds')— تخزين كائن واحد مؤقتًاreadRDS('file.rds')— الاستعادة باستخدام اسمك الخاصsave(a, b, file = 'session.RData')— تجميع عدة كائناتload('session.RData')— استعادة جميع الكائنات المجمعة- استخدم مشاريع RStudio لإدارة دليل العمل تلقائيًا
# Typical script header for clean, reproducible analysis:
rm(list = ls()) # clean workspace
options(scipen = 999, digits = 4) # formatting
# Load secrets from .Renviron:
db_url <- Sys.getenv('DATABASE_URL')
# Load cached data if available:
cache_file <- file.path('cache', 'processed_data.rds')
if (file.exists(cache_file)) {
df <- readRDS(cache_file)
cat('Loaded from cache\n')
} else {
cat('Cache not found, run data_prep.R first\n')
}
cat('Workspace ready')الأسئلة الشائعة
هل درس «مشاريع R وإدارة مساحة العمل» مجاني؟
نعم — نص درس «مشاريع R وإدارة مساحة العمل» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة R Academy، انتقل إلى CoddyKit PRO. تتضمن دورة R Academy 4 دروس في المجموع.
ماذا ستتعلم في «مشاريع R وإدارة مساحة العمل»؟
أنشئ مشاريع RStudio وأدر .RData و.Rhistory و.Renviron. تتمرن على R Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ R Academy؟
لا تُشترط خبرة سابقة. R Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «مشاريع R وإدارة مساحة العمل»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس R Academy هذا؟
نعم. كل درس في R Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- استخدام source() لتحميل السكربتات
- التعليقات والأسلوب وقابلية القراءة
- أدلة العمل ومسارات الملفات
- مشاريع R وإدارة مساحة العمل