برمجة R / أسس اللغة والبيانات / الدرس 5
الدوال والنطاق والتحقق
اجعل الوسائط والحالة الملتقطة والقيم المعادة وشروط الفشل عقداً للدالة.
في هذه الصفحة
أهداف الدرس
- تتبع حل الأسماء عبر البيئة المحيطة.
- تمييز منطق المتجهات عن التحكم المفرد.
- فحص الوسائط وإظهار فشل ذي معنى.
للدالة وسائط وجسم وبيئة
الدالة كائن يمكن إسناده وتمريره وإعادته. تشارك بيئتها المحيطة في حل الأسماء المعجمي؛ فيحل الاسم الحر في بيئة إنشاء الدالة، لا في متغيرات المستدعي المحلية ببساطة. يفيد ذلك الإغلاقات ذات الإعداد، وقد يخفي اعتماداً إذا تغيرت البيئة. فضل الوسائط الصريحة لمدخلات البيانات المعتادة ووثق الإعداد الملتقط. تجنب الإسناد العام بديلاً عن إعادة النتيجة. لا يثبت اسم دالة يبدو نقياً غياب الآثار الجانبية.
قد يحتفظ الإغلاق بإعداد مقصود
ينشئ المثال دالة تضيف إزاحة محفوظة. يقدم الاستدعاء الخارجي ثلاثة، ويحتفظ الإغلاق بها رغم إسناد 100 إلى offset عام منفصل لاحقاً. تقيّم R الوسائط تكاسلياً؛ لذلك يصرح force هنا بوقت التقاط القيمة، خصوصاً عند إنشاء دالة من تعبير يشير إلى حالة قد تتغير. يوضح المثال إغلاقاً واحداً ولا يقدم معالجة كاملة للوعود أو البرمجة فوق التعبيرات؛ وتفحصها الدروس المتقدمة بنموذج بيئة أدق.
make_shift <- function(offset) {
force(offset)
function(x) x + offset
}
shift_three <- make_shift(3)
offset <- 100
cat("shifted=", shift_three(2), "\n", sep = "")
cat("global offset=", offset, "\n", sep = "")
shifted=5
global offset=100
يحتفظ الإغلاق ببيئة إنشائه، ويصرح force بوقت تثبيت الإزاحة في هذا المثال.
تختلف القرارات المفردة عن أقنعة العناصر
يحتاج if قراراً منطقياً واحداً غير مفقود. تعيد مقارنة المتجهات متجهات وتجمعها & و| عنصراً بعنصر. يستخدم && و|| لقرار مفرد مع قصر التقييم، فيمكنهما تجنب فحص لاحق غير مناسب. يفحص المثال النوع العددي ثم عدم الفراغ ثم المنتهية. تختزل all المتجه إلى قرار، لكن all(logical(0)) صحيحة وفق عنصر الهوية؛ لذلك يلزم فحص الطول المنفصل. عالج الشرط المفقود صراحة ولا تعتبره خطأً منطقياً عادياً.
اشرح مخالفة المستدعي
ترفض الدالة المدخل غير المدعوم برسالة مستقرة قبل الحساب. يستطيع المستدعي معالجة الخطأ بـ tryCatch كما في المثال. لا تلتقط كل خطأ وتعد صفراً، فالصفر قياس معقول يخفي الفشل. ميز حالات المدخل المتوقعة عن عيوب البرمجة التي ينبغي إظهارها. افحص ما تحتاجه الدالة فعلاً؛ فالمنتهية والنوع شرطان تقنيان، بينما تتطلب المدد غير السالبة أو الوحدة عقداً مجالياً إضافياً. وضح هذه المعاني في التوثيق.
checked_mean <- function(x) {
if (!is.numeric(x) || length(x) == 0L || !all(is.finite(x))) {
stop("expected nonempty finite numeric values")
}
mean(x)
}
cat("mean=", checked_mean(c(2, 6)), "\n", sep = "")
message <- tryCatch(checked_mean(numeric(0)), error = function(e) conditionMessage(e))
cat(message, "\n", sep = "")
mean=4
expected nonempty finite numeric values
تفحص شروط قصر التقييم الوسيط قبل المتوسط، وتبقى رسالة الخطأ المخصصة ثابتة عمداً.
تدعم القيم المعادة التركيب والاختبار
تعيد R آخر تعبير مقيم ما لم يستخدم return صراحة. توضح النتائج المسماة تفسيرها أكثر من إسناد كائنات في بيئة المستدعي. لا تجعل الطباعة وسيلة وحيدة لإبلاغ قيمة تحتاجها خطوات لاحقة. اختبر المدخل العادي والنوع الخاطئ والفراغ والفقد والحدود المناسبة. افحص القيمة والنوع والأسماء والخطأ، لا اكتمال التعبير فقط. تظل البرامج توضيحية لغياب R؛ والمخرجات ومسارات الخطأ توقعات مشتقة لا أدلة تنفيذ.
الأخطاء الشائعة وإصلاحها
تغيرت الدالة بعد إسناد عام غير متعلق
- لماذا يحدث؟
- حل اسم حر إلى حالة محيطة متغيرة.
- كيف تصلحه؟
- مرر القيمة أو التقط إعداداً مقصوداً.
- كيف تتجنب تكراره؟
- راجع الأسماء الحرة واختبر الاستقلال عن العام غير المهم.
استقبل if قيماً منطقية متعددة
- لماذا يحدث؟
- استُخدمت مقارنة متجه كقرار مفرد.
- كيف تصلحه؟
- استخدم all أو any بمبرر أو اختياراً عنصرياً.
- كيف تتجنب تكراره؟
- حدد هل الشرط لكل العناصر أم لبعضها.
اجتاز الفراغ فحص المنتهية
- لماذا يحدث؟
- تعيد all قيمة الهوية للمتجه الفارغ.
- كيف تصلحه؟
- افحص الطول المطلوب منفصلاً قبل الملخص.
- كيف تتجنب تكراره؟
- أدرج الفراغ في فحوص العقد.
اختبر فهمك
1. لماذا يعيد الإغلاق خمسة بعد جعل offset العام 100؟
اعرض الحل المشروح
يحل offset في بيئة الإنشاء المحفوظة التي ثبتت القيمة ثلاثة، فيضيفها إلى اثنين. الاسم العام ربط مختلف. إذا أشارت الدالة عمداً إلى بيئة أخرى متغيرة لاحتاجت عقداً آخر.
2. لماذا لا نعيد صفراً بعد أي خطأ في دالة المتوسط؟
اعرض الحل المشروح
قد يكون الصفر متوسطاً صحيحاً فلا يميز المستدعي البيانات من الفشل. التقط الحالات المتوقعة فقط مع استجابة معرفة، وأبق الخطأ أو حالة منظمة فيما عدا ذلك؛ ولا تحول مدخلاً غير صالح إلى قياس يبدو صالحاً.
أهم ما تعلمته
- تفسر البيئات المعجمية الحالة الملتقطة.
- للتحكم المفرد وأقنعة المتجهات دوران مختلفان.
- تجعل القيم والأخطاء الصريحة الدوال قابلة للتركيب.