محتويات الدورة

برمجة R / واجهات التحليل وسلامة الجداول / الدرس 7

التكرار والعمل المتجهي وعائلة apply

اختر اجتيازاً يصرح بوحدة المدخل ونوع الناتج وسلوك الحالة الفارغة.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • تمييز العملية العنصرية عن تكرار استدعاء دالة.
  • تحديد نوع خرج مستقر باستخدام vapply.
  • استخدام فهارس آمنة ونتائج مخصصة مسبقاً.

حدد الوحدة التي تستقبلها الدالة

تعمل العملية الحسابية المتجهية على متجه وفق قواعد النوع والتدوير، بينما يستدعي الاجتياز على قائمة الدالة مرة لكل مكون. قد يكون المكون عدداً أو مجموعة كاملة أو سجلاً منظماً. حدد هذه الوحدة والناتج المتوقع قبل اختيار الأداة. لا تمرر عناصر مفردة عرضاً إلى دالة تتوقع مجموعة كاملة، ولا مجموعة إلى دالة لا تقبل إلا قيمة مفردة. وضوح العقد أهم من وجود كلمة for في الشيفرة أو غيابها.

صرح بشكل الناتج بدلاً من تخمينه

تعيد lapply قائمة بنتيجة لكل مكون. قد تبسط sapply الناتج إلى متجه أو مصفوفة وفق القيم المعادة، فيغير تحديث البيانات بنية الخرج. تطلب vapply قالب نتيجة يصرح بعقد الملخص المفرد. يطلب المثال من mean قيمة عددية واحدة لكل مجموعة، وتكون للحالة الفارغة نتيجة بطول صفر وفق القالب. إذا أعاد مكون متجهاً أو نوعاً غير مناسب، فالفشل دليل على مخالفة العقد، ولا توسع القالب دون تشخيص.

r برنامج توضيحي بلغة R الأساسية؛ لم تتوفر بيئة R أثناء المراجعة
groups <- list(a = c(2, 4), b = c(6, 8, 10))
means <- vapply(groups, mean, numeric(1))
cat("means=", paste(means, collapse = ","), "\n", sep = "")
empty <- vapply(list(), length, integer(1))
cat("empty length=", length(empty), "\n", sep = "")
الناتج المتوقع
means=3,8
empty length=0

تطلب vapply ملخصاً عددياً واحداً متوافقاً لكل مجموعة، ويبقى النوع معلناً عند فراغ القائمة.

قد تكون الحلقة الصريحة تنفيذاً دقيقاً

يخصص المثال متجهاً عددياً بطول مطلوب ثم يملأ موضعاً لكل مدخل. تنتج seq_along الفهارس الصالحة وحدها، ولا تنتج فهرساً عند الفراغ. يختلف ذلك عن 1:length(x) عند الطول صفر، إذ ينشئ تسلسلاً من واحد إلى صفر. يمنع التخصيص المسبق أيضاً نمو المتجه بإلحاق متكرر عبر c. هذه حجة بنية وتخصيص، وليست قياس سرعة. قد توضح الحلقة العقد أكثر من تركيب معقد لاستدعاءات دوال عليا.

r برنامج توضيحي بلغة R الأساسية؛ لم تتوفر بيئة R أثناء المراجعة
x <- c(1, 3, 5)
squares <- numeric(length(x))
for (i in seq_along(x)) {
  squares[i] <- x[i]^2
}
cat("squares=", paste(squares, collapse = ","), "\n", sep = "")
cat("same=", identical(squares, x^2), "\n", sep = "")
cat("empty indices=", length(seq_along(numeric(0))), "\n", sep = "")
الناتج المتوقع
squares=1,9,25
same=TRUE
empty indices=0

يثبت التخصيص المسبق حجم الناتج، وتعالج seq_along المتجه الفارغ دون فهارس عرضية.

قد يغير اجتياز المصفوفة نوع البيانات

تعمل apply على هوامش كائن مصفوفي، وقد تحول إطار البيانات إلى مصفوفة أولاً. إذا فرض عمود نصي نوعاً نصياً مشتركاً فقد يفشل الملخص العددي أو يستقبل تمثيلاً خاطئاً. للأعمدة غير المتجانسة اختر اجتياز قائمة وافحص الأعمدة المحددة. تختلف دلالة هامش الصف عن العمود؛ فاختبر حالة غير مربعة وقيماً معروفة. حافظ على أسماء النتائج ومحاذاتها، ولا تفك بنية منظمة مبكراً باستخدام unlist فتضيع الحدود المطلوبة لاحقاً.

افصل الصحة عن الكلفة

قارن القيم والنوع والطول والأسماء والفقد والفراغ بمرجع بسيط قبل التحسين. توفر Vectorize تكرار استدعاء، ولا يعد اسمها بنواة عددية سريعة متخصصة. قد يكلف تعبير متجهي مختصر مصفوفات وسيطة كبيرة. قس حالة ممثلة ومحدودة في R الفعلية قبل ادعاء سرعة، مع حفظ المعنى. لا ينفذ المساق اختبارات R أو أداء؛ بل يقدم نتائج مشتقة وأمثلة تجعل الاجتياز قابلاً للمراجعة المستقلة.

الأخطاء الشائعة وإصلاحها

تغير الملخص من متجه إلى مصفوفة

لماذا يحدث؟
اعتمد التبسيط التلقائي على أطوال النتائج.
كيف تصلحه؟
استخدم lapply للبنية أو vapply بقالب مبرر.
كيف تتجنب تكراره؟
اختبر المكونات العادية والمفردة والفارغة والمختلفة.

عملت الحلقة على مدخل فارغ

لماذا يحدث؟
أنشأت 1:length(x) فهارس رغم الطول صفر.
كيف تصلحه؟
استخدم seq_along أو seq_len وفق العقد.
كيف تتجنب تكراره؟
اختبر الصفر في فحوص الاجتياز.

استقبل ملخص عددي قيماً نصية

لماذا يحدث؟
حول إطار غير متجانس إلى مصفوفة موحدة النوع.
كيف تصلحه؟
اختر الأعمدة العددية أو اجتز الأعمدة كقائمة.
كيف تتجنب تكراره؟
افحص النوع قبل التحويل وبعده.

اختبر فهمك

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

اعرض الحل المشروح

استخدم vapply(x, length, integer(1)). تعيد كل دعوة عدداً صحيحاً واحداً فتكون النتائج 2,1,0. تعيد lapply قائمة بهذه الأعداد، بينما يجعل التبسيط المتساهل عقد الخرج أقل صراحة.

2. لماذا قد يكون تعبير متجهي أبطأ أو أكثر استهلاكاً من حلقة؟

اعرض الحل المشروح

قد يخصص كائناً وسيطاً كبيراً أو ينفذ عملاً تتجنبه الحلقة. لا تصف الصياغة وحدها العمليات الفعلية. أثبت تكافؤ المعنى وافحص التخصيص ثم قس حملاً ممثلاً محدوداً في البيئة المدعومة.

أهم ما تعلمته

  • وحدة الاجتياز وقالب الناتج جزء من الواجهة.
  • تشمل الفهارس الآمنة حالة الفراغ.
  • ليست الصياغة المختصرة دليلاً على الأداء.

المراجع الرسمية