Αυτή είναι μια μεγάλη έννοια στη 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
Αυτό δεν είναι απλώς σύντομο και βολικό, αφού αποφεύγει την ανάγκη για βρόχους, list comprehensions ή αναδρομή, που συνηθίζονται σε άλλες γλώσσες. Στη R, οι διανυσματικές συναρτήσεις συχνά τρέχουν πολύ πιο γρήγορα από αυτές τις τεχνικές.
Έχεις ήδη χρησιμοποιήσει διανυσματοποιημένες συναρτήσεις πολύ περισσότερο απ' ό,τι μάλλον νομίζεις. Σύγκρινε αυτά:
v <- c(2, 7, 9)
w <- c(3, 1, 5)
v + w
#> [1] 5 8 14
"+"(v, w)
#> [1] 5 8 14
Οι γνωστοί τελεστές infix δεν είναι παρά συντακτική ζάχαρη για την υποκείμενη διανυσματοποιημένη συνάρτηση! Σε αυτή την περίπτωση, την "+"().
Για την ταξινόμηση ενός διανύσματος, υπάρχει η 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 (καλύπτεται σε επόμενη έννοια).