النطاق العام مقابل المحلي
ميّز بين .GlobalEnv وبيئات الدوال والإغلاقات.
النطاق العام مقابل المحلي درس مجاني في R Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في R Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة R Academy 4 دروس في المجموع.
المتغيرات المحلية في الدوال
تكون المتغيرات التي يُسنَد إليها باستخدام <- أو = داخل جسم الدالة محلية لتلك الدالة. وتُنشأ في بيئة الدالة نفسها وتختفي عند عودة الدالة. ولا تؤثر أبدًا في نطاق الاستدعاء.
x <- 'global'
f <- function() {
x <- 'local' # creates a new local binding, does not modify global x
cat('Inside f: x =', x, '\n')
}
f()
cat('Outside f: x =', x, '\n') # still 'global'معلمات الدوال محلية
معلمات الدوال متغيرات محلية أيضًا. ولا يؤثر تعديل معلمة داخل الدالة في الوسيط الموجود في بيئة الاستدعاء. تمرر R الوسائط بالقيمة (مع دلالات النسخ عند التعديل).
double_it <- function(n) {
n <- n * 2 # modifies local copy only
cat('Inside:', n, '\n')
}
my_n <- 5
double_it(my_n)
cat('Outside:', my_n, '\n') # still 5استخدام <<- للتعيين العام
يبحث <<- (التعيين الفائق) صعودًا في سلسلة الأصول ويعيّن القيمة لأول تطابق يعثر عليه. وإذا لم يوجد تطابق في أي مكان، ينشئ الرابط في البيئة العامة. استخدمه باعتدال — فالإفراط في استخدام <<- يجعل فهم الدوال أصعب.
total <- 0
add_to_total <- function(x) {
total <<- total + x
}
add_to_total(10)
add_to_total(25)
add_to_total(5)
cat('Total:', total, '\n')يبحث <<- صعودًا في السلسلة
لا يعيّن <<- القيمة مباشرةً في البيئة العامة، بل ينتقل صعودًا في سلسلة الأصول ويعيّنها في أول بيئة يوجد فيها الاسم مسبقًا. وإذا كان المتغير موجودًا في دالة محيطة، فسيُحدَّث هناك.
outer <- function() {
n <- 0
increment <- function() n <<- n + 1
increment()
increment()
cat('n in outer:', n, '\n') # n was in outer's env, updated there
}
outer()
# n does NOT appear in global env
cat('n in global:', exists('n', envir = globalenv()), '\n')assign() للاستهداف الصريح لبيئة
تعيّن assign('name', value, envir = e) قيمة مباشرةً إلى بيئة محددة. وهي أكثر وضوحًا من <<-، ومفيدة عندما يكون لديك كائن بيئة وتريد تعيين قيمة فيه بدقة.
my_env <- new.env(parent = emptyenv())
assign('score', 95, envir = my_env)
assign('name', 'Alice', envir = my_env)
cat('score:', get('score', envir = my_env), '\n')
cat('name :', get('name', envir = my_env), '\n')local() — كتل تعليمات معزولة
تقيّم local({...}) تعبيرًا في بيئة محلية جديدة. ولا تتسرب المتغيرات المنشأة داخل الكتلة إلى البيئة العامة. وهذا مفيد للحسابات المؤقتة التي لا ينبغي أن تلوث مساحة العمل.
result <- local({
temp1 <- 100
temp2 <- 200
temp1 + temp2 # the last expression is returned
})
cat('result:', result, '\n')
cat('temp1 in global:', exists('temp1'), '\n') # FALSElocal() مقابل الدالة للعزل
يوفر كل من local() والدالة المستدعاة مباشرةً عزلًا للنطاق. ويكون local() أكثر اختصارًا للعزل لمرة واحدة، بينما تكون الدالة المسماة أفضل عندما تريد جعل المنطق قابلًا لإعادة الاستخدام أو الاختبار.
# Option A: local()
result_a <- local({
x <- 7
y <- 3
x * y
})
# Option B: immediately invoked function
result_b <- (function() {
x <- 7
y <- 3
x * y
})()
cat(result_a, result_b, '\n')
cat('x in global:', exists('x'), '\n')قراءة المتغيرات العامة من دالة
يمكن للدوال قراءة المتغيرات من نطاقها المحيط (سواء كان عامًا أم غير ذلك) دون أي صياغة خاصة. وهذا جزء من النطاق المعجمي المعتاد. ومع ذلك، فإن الاعتماد المكثف على الحالة العامة يجعل اختبار الدوال أصعب — لذا يُفضَّل استخدام الوسائط الصريحة متى أمكن.
tax_rate <- 0.20 # global configuration
apply_tax <- function(price) {
price * (1 + tax_rate) # reads tax_rate from global
}
cat(apply_tax(100), '\n')
cat(apply_tax(250), '\n')حجب المتغيرات
عندما يحمل متغير محلي الاسم نفسه لمتغير عام، فإن الارتباط المحلي يحجب الارتباط العام. ويُستخدم الإصدار المحلي داخل الدالة، بينما يظل العام دون تغيير. وقد يتسبب ذلك في أخطاء دقيقة إذا حدث دون قصد.
mean <- 99 # shadows base R's mean() function
cat(mean, '\n') # prints 99, not the function
# To call the real mean, use base:: prefix
cat(base::mean(c(1, 2, 3, 4, 5)), '\n')
rm(mean) # remove the shadowبيئات function()
في كل مرة تُستدعى فيها دالة، تنشئ R بيئة جديدة لذلك الاستدعاء، ويكون أصلها هو البيئة المحيطة بالدالة. ولا تتداخل المتغيرات المحلية من الاستدعاءات المختلفة، حتى في الاستدعاءات التكرارية.
factorial_r <- function(n) {
# Each recursive call has its own local n
if (n <= 1) return(1)
n * factorial_r(n - 1)
}
cat('5! =', factorial_r(5), '\n')
cat('7! =', factorial_r(7), '\n')استخدام rm() لإزالة المتغيرات
تزيل rm('name') أو rm(name) رابطًا من البيئة الحالية (أو المحددة). استخدمها لتنظيف المتغيرات المؤقتة. ومرر envir = e للإزالة من بيئة محددة.
x <- 42
y <- 'hello'
cat('Before rm:', ls(), '\n')
rm(x)
cat('After rm(x):', exists('x'), '\n')
rm('y')
cat('After rm(y):', exists('y'), '\n')تحقق سريع
ماذا يفعل <<- ولا يفعله <- العادي؟
النطاق: أهم النقاط
أهم النقاط المتعلقة بالنطاق العام والمحلي:
- ينشئ
<-داخل دالة متغيرًا محليًا — ولا تتغير البيئة العامة - معلمات الدوال محلية؛ وتمرر R القيم بالقيمة (مع النسخ عند التعديل)
- ينتقل
<<-صعودًا في سلسلة الأصول ويعدّل أول رابط مطابق - استخدم
assign('x', val, envir=e)للتعيين الصريح الموجّه إلى بيئة - يوفر
local({...})نطاقًا مؤقتًا من دون إنشاء دالة مسماة - تجنب حجب الأسماء المهمة (مثل
meanوcوT)
# Demonstrate local + <<- cleanly
running_sum <- 0
local({
values <- c(10, 20, 30, 40)
for (v in values) running_sum <<- running_sum + v
})
cat('Running sum:', running_sum, '\n')
cat('values in global:', exists('values'), '\n')الأسئلة الشائعة
هل درس «النطاق العام مقابل المحلي» مجاني؟
نعم — نص درس «النطاق العام مقابل المحلي» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة R Academy، انتقل إلى CoddyKit PRO. تتضمن دورة R Academy 4 دروس في المجموع.
ماذا ستتعلم في «النطاق العام مقابل المحلي»؟
ميّز بين .GlobalEnv وبيئات الدوال والإغلاقات. تتمرن على R Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ R Academy؟
لا تُشترط خبرة سابقة. R Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «النطاق العام مقابل المحلي»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس R Academy هذا؟
نعم. كل درس في R Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- ما البيئة في R؟
- قواعد النطاق المعجمي
- النطاق العام مقابل المحلي
- إنشاء البيئات وفحصها