هذا مفهوم كبير في R. ولكي نستوعب الاحتمالات الممكنة، قد يفيدنا أن نتأمل أبعاد المدخل والمخرج في مختلف الدوال.
رأينا بالفعل دوالًّا تأخذ متجهًا وتُرجع قيمة واحدة شبيهة بالقيم القياسية:
> v <- 1:5
> length(v)
#> [1] 5
> sum(v)
#> [1] 15
وتندرج دوال إحصائية كثيرة أيضًا ضمن هذه الفئة، مثل mean().
أما المتجهات المنطقية، فلدينا all() وany().
تعمل دوال كثيرة في R على متجهات كاملة، وكثيرًا ما تعطي مخرجات متجهية. ويشمل ذلك معظم الدوال الرياضية:
> sq <- c(4, 9, 16, 25)
> sqrt(sq) # square root
#> [1] 2 3 4 5
وهذا ليس مجرد أسلوب موجز ومريح يغنيك عن الحلقات أو استيعاب القوائم أو الاستدعاء الذاتي، وهي أساليب شائعة في لغات أخرى. وفي R، غالبًا ما تعمل الدوال المتجهية أسرع بكثير من تلك الأساليب.
ولترتيب متجه، لدينا sort() لإرجاع القيم وorder() لإرجاع الفهارس:
> v <- c("I", "am", "not", "in", "order")
> sort(v)
#> [1] "am" "I" "in" "not" "order"
> order(v)
#> [1] 2 1 4 3 5
الترتيب الافتراضي تصاعدي.
حدّد decreasing = TRUE عند الحاجة، أو استخدم rev() لعكس متجه موجود.
v <- c("I", "am", "not", "in", "order")
sort(v, decreasing = TRUE)
#> [1] "order" "not" "in" "I" "am"
rev(1:4)
#> [1] 4 3 2 1
وهناك أيضًا دوال تنتج مخرجات متجهية تراكمية، إذ تعمل على متجه المدخل من اليسار إلى اليمين:
> cumsum(1:5)
#> [1] 1 3 6 10 15 # sums
> cumprod(1:5)
#> [1] 1 2 6 24 120 # equivalent to factorials
ويمكن أيضًا استخدام امتداد لهذا المفهوم لمقارنة المتجهات.
على سبيل المثال، تأمل دالة القيمة العظمى لكل زوج pmax():
> v
#> [1] 2 7 9
> w
#> [1] 3 1 5
> pmax(v, w)
#> [1] 3 7 9 # max of each pairwise comparison
أنت مراقب طيور شغوف يتابع عدد الطيور التي زارت حديقتك خلال الأيام السبعة الماضية.
أمامك ست مهام، وكلها تتعلق بأعداد الطيور التي زارت حديقتك.
نفّذ الدالة today() لتُرجع عدد الطيور التي زارت حديقتك اليوم. أعداد الطيور مرتبة حسب اليوم، بحيث يكون العنصر الأول عدد أقدم يوم، والعنصر الأخير عدد اليوم الحالي.
birds_per_day <- c(2, 5, 0, 7, 4, 1)
today(birds_per_day)
# => 1
نفّذ الدالة increment_todays_count() لزيادة عدد اليوم:
birds_per_day <- c(2, 5, 0, 7, 4, 1)
increment_todays_count(birds_per_day)
# => c(2, 5, 0, 7, 4, 2)
نفّذ الدالة has_day_without_birds() التي تُرجع TRUE إذا كان هناك يوم لم تزر فيه أي طيور الحديقة؛ وإلا فتُرجع FALSE:
birds_per_day <- c(2, 5, 0, 7, 4, 1)
has_day_without_birds(birds_per_day)
# => true
نفّذ الدالة count_for_first_days() التي تُرجع عدد الطيور التي زارت حديقتك منذ بداية الأسبوع، لكن اقتصر العدد على عدد الأيام المحدد من بداية الأسبوع.
birds_per_day <- c(2, 5, 0, 7, 4, 1)
count_for_first_days(birds_per_day, 4)
# => 14
بعض الأيام أكثر ازدحامًا من غيرها. اليوم المزدحم هو الذي زارت فيه خمسة طيور أو أكثر حديقتك.
نفّذ الدالة busy_days() لتُرجع عدد الأيام المزدحمة:
birds_per_day <- c(2, 5, 0, 7, 4, 1)
busy_days(birds_per_day)
# => 2
أنت فضولي لمعرفة العدد الإجمالي للطيور التي زارت حتى الآن هذا الأسبوع. احسب المجاميع التراكمية لكل يوم.
running_total(c(7, 6, 5, 4, 3, 2, 1))
#> [1] 7 13 18 22 25 27 28
تشك أن زيارات الطيور تتأثر بأنماط حركة المرور على الطرق القريبة، فتختلف في عطلة نهاية الأسبوع عنها في أيام الأسبوع.
رتّب اختصارات الأيام بترتيب تنازلي حسب عدد الطيور التي زارت.
day_names <- c("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")
birds_per_day <- c(5, 2, 4, 6, 0, 9, 8)
busy_days_of_week(birds_per_day, day_names)
#> [1] "Sat" "Sun" "Thu" "Mon" "Wed" "Tue" "Fri"
سجّل في Exercism لتتعلّم وتتقن R عبر 21 مفهومًا111 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.