ما البيئة في R؟
استكشف البيئات بوصفها قوائم مسمّاة ذات مؤشرات إلى بيئاتها الأصلية.
ما البيئة في R؟ درس مجاني في R Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في R Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة R Academy 4 دروس في المجموع.
ما البيئة؟
في R، البيئة مجموعة من الارتباطات المسماة (تشبه قائمة مسماة) بالإضافة إلى مؤشر إلى البيئة الأصل. يعيش كل متغير في بيئة ما. وعندما تبحث R عن اسم، تبحث أولًا في البيئة الحالية، ثم تصعد عبر سلسلة البيئات الأصل.
# The global environment holds your session variables
x <- 42
cat('x is in globalenv:', exists('x', envir = globalenv()), '\n')
cat('globalenv name:', environmentName(globalenv()), '\n')globalenv() وbaseenv() وemptyenv()
تحتوي R على عدة بيئات مضمنة: تمثل globalenv() مساحة العمل التفاعلية الخاصة بكم، وتحتوي baseenv() على دوال R الأساسية، بينما تمثل emptyenv() قمة السلسلة ولا أب لها. وتنتهي كل سلسلة بيئات في النهاية عند emptyenv().
cat('global :', environmentName(globalenv()), '\n')
cat('base :', environmentName(baseenv()), '\n')
cat('empty :', environmentName(emptyenv()), '\n')
cat('parent of global:', environmentName(parent.env(globalenv())), '\n')سلسلة البيئات
لكل بيئة أصل واحد بالضبط، باستثناء emptyenv(). عندما لا تتمكن R من العثور على اسم في البيئة الحالية، تنتقل إلى الأصل، ثم إلى أصل الأصل، وهكذا. وتوضح هذه السلسلة كيفية حل R لأسماء المتغيرات.
# Walk the parent chain from globalenv
env <- globalenv()
for (i in 1:5) {
cat(sprintf('Level %d: %s\n', i, environmentName(env)))
if (identical(env, emptyenv())) break
env <- parent.env(env)
}environment() لدالة
لكل دالة بيئة مرتبطة بها، وهي البيئة التي أُنشئت فيها. تُرجع environment(f) تلك البيئة. وهذه هي البيئة المحيطة بالدالة، وتحدد المكان الذي تبحث فيه عن المتغيرات الحرة.
f <- function() 'hello'
cat('f was defined in:', environmentName(environment(f)), '\n')
# Inside a function, environment() returns its own env
show_env <- function() {
cat('my env:', environmentName(environment()), '\n')
}
show_env()as.list() على بيئة
تحول as.list(env) ارتباطات البيئة إلى قائمة مسماة، وهو ما يفيد في فحص محتوياتها برمجيًا. ويؤدي دمجها مع globalenv() إلى عرض جميع متغيرات الجلسة الحالية.
a <- 10
b <- 'hello'
c_val <- TRUE
# Show current global bindings as list
bindings <- as.list(globalenv())
cat('Names in globalenv:', paste(ls(globalenv()), collapse = ', '), '\n')ls() — سرد محتويات البيئة
تسرد ls() الأسماء المرتبطة في بيئة. وتعرض البيئة العامة افتراضيًا. مرروا envir = e لفحص بيئة محددة. وأضيفوا all.names = TRUE لتضمين الأسماء التي تبدأ بـ ..
my_env <- new.env(parent = emptyenv())
my_env$x <- 1
my_env$y <- 'two'
my_env$.hidden <- TRUE
cat('Default ls:', ls(envir = my_env), '\n')
cat('All names :', ls(envir = my_env, all.names = TRUE), '\n')new.env() — إنشاء البيئات
تنشئ new.env(parent = e) بيئة جديدة فارغة ذات الأصل المحدد. استخدم emptyenv() كأصل عندما تريد بيئة معزولة تمامًا بلا روابط موروثة.
e <- new.env(parent = emptyenv())
e$name <- 'Alice'
e$score <- 95
cat('Names:', ls(e), '\n')
cat('Name binding:', e$name, '\n')البيئات مقابل القوائم
تبدو البيئات مثل القوائم المسماة، لكنها تتصرف بشكل مختلف: إذ تُعدَّل دائمًا في مكانها (من دون النسخ عند التعديل)، ولها أصل، ويُجرى البحث عن الأسماء باستخدام جدول تجزئة (بسرعة). أما القوائم فتُنسخ عند تعديلها، بينما لا تُنسخ البيئات.
# Environments are reference objects (no copy-on-modify)
e <- new.env(parent = emptyenv())
e$x <- 1
f <- e # f points to same env, not a copy
f$x <- 99
cat('e$x after modifying through f:', e$x, '\n')استخدام exists() و get() في بيئة
تتحقق exists('name', envir = e) مما إذا كان اسم ما مرتبطًا في بيئة (أو في آبائها افتراضيًا). وتسترجع get('name', envir = e) القيمة. تقبل الدالتان inherits = FALSE للبحث في البيئة المحددة فقط.
e <- new.env(parent = emptyenv())
e$pi_approx <- 3.14159
cat('exists pi_approx:', exists('pi_approx', envir = e), '\n')
cat('exists missing: ', exists('missing_var', envir = e), '\n')
cat('get pi_approx: ', get('pi_approx', envir = e), '\n')environmentName() للبيئات المضمنة
تعيد environmentName(env) الاسم المقروء للبشر للبيئات الخاصة. وتعيد البيئات التي ينشئها المستخدم '' (سلسلة فارغة). يساعدك ذلك على تتبع المكان الذي عُرّفت فيه المتغيرات عند تصحيح الأخطاء.
cat(environmentName(globalenv()), '\n') # R_GlobalEnv
cat(environmentName(baseenv()), '\n') # package:base
cat(environmentName(emptyenv()), '\n') # R_EmptyEnv
e <- new.env(parent = emptyenv())
cat('User env name: "', environmentName(e), '"\n', sep = '')تطبيق عملي: استخدام البيئات كذاكرات مؤقتة
بما أن البيئات تُعدَّل في مكانها، فهي مناسبة للذاكرات المؤقتة القابلة للتغيير أو لخرائط التجزئة. خزّن النتائج المحسوبة في بيئة لتجنب إعادة حسابها — فهذا أسرع من تعديل قائمة (إذ تُنسخ القائمة).
cache <- new.env(parent = emptyenv(), hash = TRUE)
cached_square <- function(n) {
key <- as.character(n)
if (exists(key, envir = cache, inherits = FALSE))
return(get(key, envir = cache))
result <- n^2
assign(key, result, envir = cache)
result
}
cat(cached_square(7), '\n')
cat(cached_square(7), '\n') # served from cacheتحقق سريع
ما البيئة الأعلى في سلسلة بيئات R — أي البيئة التي لا أصل لها؟
البيئات: أهم النقاط
أهم النقاط المتعلقة ببيئات R:
- البيئة = روابط مسماة + مؤشر إلى الأصل
globalenv()= مساحة العمل الخاصة بك؛baseenv()= R الأساسي؛emptyenv()= نهاية السلسلة- ينتقل البحث عن الاسم صعودًا في سلسلة الأصول حتى العثور عليه أو الوصول إلى
emptyenv() - تسرد
ls(envir=e)الروابط؛ وتتحققexists()من وجودها؛ وتسترجعget()قيمها - البيئات كائنات مرجعية — ولا تُنسخ عند التعديل
- تنشئ
new.env(parent=emptyenv())بيئة معزولة
e <- new.env(parent = emptyenv())
assign('counter', 0L, envir = e)
for (i in 1:5) assign('counter', e$counter + 1L, envir = e)
cat('Counter:', e$counter, '\n')
cat('Env name:', environmentName(e), '\n')
cat('Bindings:', ls(e), '\n')الأسئلة الشائعة
هل درس «ما البيئة في R؟» مجاني؟
نعم — نص درس «ما البيئة في R؟» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة R Academy، انتقل إلى CoddyKit PRO. تتضمن دورة R Academy 4 دروس في المجموع.
ماذا ستتعلم في «ما البيئة في R؟»؟
استكشف البيئات بوصفها قوائم مسمّاة ذات مؤشرات إلى بيئاتها الأصلية. تتمرن على R Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ R Academy؟
لا تُشترط خبرة سابقة. R Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «ما البيئة في R؟»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس R Academy هذا؟
نعم. كل درس في R Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.