هذا مفهوم واسع في R. ولكي تتضح الصورة بشأن الاحتمالات المتاحة، قد يفيدك أن تتأمل في أبعاد مُدخلات الدوال المختلفة ونواتجها.
رأينا بالفعل دوالًّا تأخذ متجهًا وتُرجع قيمة واحدة شبيهة بالقيمة القياسية:
v <- 1:5
length(v)
#> [1] 5
sum(v)
#> [1] 15
وتندرج في هذه الفئة أيضًا دوال إحصائية كثيرة، مثل mean().
وبالنسبة إلى المتجهات المنطقية، هناك all() وany()، وهما تُرجعان قيمة TRUE أو FALSE واحدة.
كثيرة هي الدوال في R التي تعمل على متجهات كاملة، وغالبًا ما يكون ناتجها متجهًا. ويشمل ذلك معظم الدوال الرياضية:
sq <- c(4, 9, 16, 25)
sqrt(sq) # square root
#> [1] 2 3 4 5
وهذا ليس مجرد أسلوب موجز ومريح يغنيك عن الحلقات أو استيعاب القوائم أو الاستدعاء الذاتي الشائعة في لغات أخرى. وفي R، غالبًا ما تعمل دوال المتجهات أسرع بكثير من تلك الأساليب.
أنت تستخدم بالفعل دوالًّا متجهية أكثر مما تظن. قارن بين هذين:
v <- c(2, 7, 9)
w <- c(3, 1, 5)
v + w
#> [1] 5 8 14
"+"(v, w)
#> [1] 5 8 14
العوامل المألوفة الموضوعة بين قيمتين ليست سوى سكر نحوي للدالة المتجهية الكامنة خلفها! وفي هذه الحالة، الدالة "+"().
ولفرز متجه، هناك 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() وcumprod() تُنتج نواتج متجهية تراكمية، إذ تعمل على متجه الدخل من اليسار إلى اليمين:
cumsum(1:5)
#> [1] 1 3 6 10 15 # sums
cumprod(1:5)
#> [1] 1 2 6 24 120 # equivalent to factorials
تتشابه الأمثلة أعلاه مع عمليات foldl في كثير من اللغات الوظيفية، إلا أن الناتج متجه يحوي جميع القيم الوسيطة.
ويمكن أيضًا استخدام امتداد لهذا المفهوم لمقارنة المتجهات.
على سبيل المثال، تأمل دالة القيمة العظمى لكل زوج pmax():
v
#> [1] 2 7 9
w
#> [1] 3 1 5
pmax(v, w)
#> [1] 3 7 9 # max of each pairwise comparison
تقبل هذه الدالة وغيرها من الدوال المشابهة أي عدد من متجهات الدخل، وليس متجهين فقط.
يستخدم المثال أعلاه متجهات متساوية الطول. وكما نوقش في مفهوم تصفية المتجهات، تستخدم R إعادة التدوير لتوسيع المتجهات "القصيرة جدًّا" بطريقة ما. وللتذكير: استخدم هذا بحذر، ويُفضَّل أن يكون مع متجه طوله 1 فقط.
pmax(v, 5)
#> [1] 5 7 9
هذا أقل شيوعًا، لكن من السهل نسبيًّا كتابة دوال يبدو دخلها قياسيًّا وناتجها متجهيًّا.
وعند تطبيقها على دخل متجهي، يكون الناتج matrix ثنائي الأبعاد (سيُغطّى في مفهوم لاحق).