0Pricing
R Academy · درس

إنشاء البيئات وفحصها

استخدم new.env() وenvironment() وls() وget() للعمل مع البيئات.

إنشاء البيئات وفحصها درس مجاني في R Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في R Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة R Academy 4 دروس في المجموع.

إنشاء بيئة جديدة

تنشئ new.env(parent = e) بيئة جديدة فارغة. وتحدد وسيطة parent البيئة التي يُبحث فيها عندما لا يُعثر على اسم في البيئة الجديدة. استخدم emptyenv() للحصول على بيئة معزولة بالكامل.

# Isolated environment (no parent chain)
e1 <- new.env(parent = emptyenv())
# Environment with global as parent
e2 <- new.env(parent = globalenv())
cat('e1 parent:', environmentName(parent.env(e1)), '\n')
cat('e2 parent:', environmentName(parent.env(e2)), '\n')

assign() — إضافة الروابط

تنشئ assign('name', value, envir = e) رابطًا مسمى في البيئة المحددة أو تحدّثه. وهي المكافئ البرمجي لـ e$name <- value، لكنها تعمل عندما يكون الاسم مخزنًا في متغير.

e <- new.env(parent = emptyenv())
assign('x', 10, envir = e)
assign('y', 'hello', envir = e)
assign('z', TRUE, envir = e)
cat('x:', get('x', envir = e), '\n')
cat('y:', get('y', envir = e), '\n')

get() و mget()

تسترجع get('name', envir = e) رابطًا واحدًا. وتسترجع mget(c('a','b'), envir = e) روابط متعددة دفعةً واحدة، وتعيدها في قائمة مسماة. وتطرح الدالتان خطأً إذا لم يكن الاسم موجودًا (ما لم تسمح inherits بالبحث في السلسلة).

e <- new.env(parent = emptyenv())
e$alpha <- 1
e$beta  <- 2
e$gamma <- 3
# Single
get('alpha', envir = e)
# Multiple
mget(c('alpha', 'beta', 'gamma'), envir = e)

ls() — سرد الروابط

تعيد ls(envir = e) متجهًا نصيًا يضم جميع الأسماء المرتبطة في البيئة e. أضف all.names = TRUE لتضمين الأسماء التي تبدأ بـ . (وهي مخفية افتراضيًا). وتُعاد الأسماء بترتيب أبجدي.

e <- new.env(parent = emptyenv())
e$b_val  <- 2
e$a_val  <- 1
e$.secret <- 'hidden'
cat('Default ls:', ls(envir = e), '\n')
cat('All names :', ls(envir = e, all.names = TRUE), '\n')

استخدام exists() مع inherits

تتحقق exists('name', envir = e, inherits = FALSE) من البيئة المحددة فقط، لا من آبائها. ومع inherits = TRUE (الإعداد الافتراضي)، تبحث أيضًا في سلسلة الأصول. استخدم inherits = FALSE لإجراء فحوصات محلية صارمة.

parent_e <- new.env(parent = emptyenv())
parent_e$shared <- 42
child_e  <- new.env(parent = parent_e)
# inherits=TRUE: finds shared in parent
cat('inherits TRUE:', exists('shared', envir = child_e, inherits = TRUE),  '\n')
# inherits=FALSE: only looks in child
cat('inherits FALSE:', exists('shared', envir = child_e, inherits = FALSE), '\n')

environmentName() و parent.env()

تعيد environmentName(e) اسم البيئة المضمنة ('R_GlobalEnv' و'package:base' وما إلى ذلك). وتعيد البيئات التي ينشئها المستخدم ''. أما parent.env(e) فتعيد كائن البيئة الأصل.

e <- new.env(parent = globalenv())
cat('Name of e     :', environmentName(e), '\n')
cat('Parent of e   :', environmentName(parent.env(e)), '\n')
cat('Name of global:', environmentName(globalenv()), '\n')

صياغة $ للبيئات

تدعم البيئات صياغة $ و[[ مثل القوائم لقراءة الروابط وكتابتها. وغالبًا ما تكون هذه الصياغة أكثر ملاءمة من get()/assign() للوصول المباشر عندما يكون الاسم معروفًا وقت الكتابة.

e <- new.env(parent = emptyenv())
e$pi_approx <- 3.14159
e[['e_approx']] <- 2.71828
cat('pi:', e$pi_approx, '\n')
cat('e :', e[['e_approx']], '\n')

استخدام rm() في بيئة محددة

تزيل rm('name', envir = e) رابطًا من بيئة محددة. ويختلف ذلك عن إزالة متغير عام — إذ يجب تحديد البيئة صراحةً عند التعامل مع البيئات المخصصة.

e <- new.env(parent = emptyenv())
e$keep <- 1
e$remove_me <- 99
cat('Before:', ls(envir = e), '\n')
rm('remove_me', envir = e)
cat('After :', ls(envir = e), '\n')

as.list() لتفريغ بيئة

تحوّل as.list(e) جميع الروابط في بيئة إلى قائمة مسماة، ما يسهّل فحص المحتويات أو إجراء تسلسل لها. وتكون النتيجة نسخة ثابتة — فلا تنعكس التغييرات اللاحقة في البيئة على القائمة.

e <- new.env(parent = emptyenv())
e$x <- 10
e$y <- 20
e$z <- 30
bindings <- as.list(e)
cat('Class:', class(bindings), '\n')
cat('Length:', length(bindings), '\n')
str(bindings)

البيئات كجداول تجزئة

يتيح الخيار hash = TRUE في new.env() (وهو افتراضي عند تحديد الأصل) البحث القائم على التجزئة، ما يجعل البحث عن الأسماء بزمن O(1). ويجعل ذلك البيئات الكبيرة أسرع بكثير من القوائم عند تخزين أزواج المفتاح والقيمة.

# Build a small key-value store
store <- new.env(hash = TRUE, parent = emptyenv())
keys   <- paste0('key_', 1:5)
values <- c(10, 20, 30, 40, 50)
for (i in seq_along(keys)) assign(keys[i], values[i], envir = store)
# Retrieve
cat('key_3 =', get('key_3', envir = store), '\n')
cat('All keys:', ls(store), '\n')

نسخ البيئات مقابل مشاركتها

لا يؤدي إسناد بيئة إلى متغير جديد إلى نسخها، بل يشير كلا المتغيرين إلى الكائن نفسه. استخدم as.list() ثم list2env() لإنشاء نسخة فعلية إذا كنت تحتاج إلى بيئات مستقلة.

e1 <- new.env(parent = emptyenv())
e1$val <- 100
e2 <- e1          # reference, not a copy
e2$val <- 999
cat('e1$val:', e1$val, '\n')  # 999, modified via e2!

# True copy:
e3 <- list2env(as.list(e1), parent = emptyenv())
e3$val <- 0
cat('e1$val after e3 change:', e1$val, '\n')  # still 999

تحقق سريع

ما الدالة التي تتحقق من ارتباط اسم ببيئة من دون البحث في البيئات الأصلية لها؟

إنشاء البيئات: أهم النقاط

أهم النقاط المتعلقة بإنشاء البيئات وفحصها:

  • تنشئ new.env(parent=e) بيئة جديدة فارغة؛ استخدم hash=TRUE للمخازن الكبيرة
  • استخدم assign('x', v, envir=e) وget('x', envir=e) للوصول البرمجي
  • يعمل e$x وe[['x']] مثل أدوات الوصول إلى القوائم
  • يسرد ls(envir=e) الأسماء؛ واستخدم exists('x', envir=e, inherits=FALSE) للتحقق الصارم
  • يفرغ as.list(e) محتوى البيئة في قائمة؛ وتعيد list2env() إنشاء البيئة
  • البيئات كائنات مرجعية، لذا تؤدي عملية الإسناد إلى المشاركة لا النسخ
config <- new.env(hash = TRUE, parent = emptyenv())
assign('host', 'localhost', envir = config)
assign('port', 5432L,       envir = config)
assign('db',   'mydb',      envir = config)
cat('Keys  :', ls(config), '\n')
cat('host  :', config$host, '\n')
cat('port  :', config$port, '\n')

الأسئلة الشائعة

هل درس «إنشاء البيئات وفحصها» مجاني؟

نعم — نص درس «إنشاء البيئات وفحصها» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة R Academy، انتقل إلى CoddyKit PRO. تتضمن دورة R Academy 4 دروس في المجموع.

ماذا ستتعلم في «إنشاء البيئات وفحصها»؟

استخدم new.env() وenvironment() وls() وget() للعمل مع البيئات. تتمرن على R Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ R Academy؟

لا تُشترط خبرة سابقة. R Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «إنشاء البيئات وفحصها»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس R Academy هذا؟

نعم. كل درس في R Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. ما البيئة في R؟
  2. قواعد النطاق المعجمي
  3. النطاق العام مقابل المحلي
  4. إنشاء البيئات وفحصها
← العودة إلى R Academy