Parcours
/
R
R
/
Programme
/
Fonctions vectorielles
Fo

Fonctions vectorielles en R

1 exercice

À propos de Fonctions vectorielles

C'est un concept important en R. Pour mieux comprendre les possibilités, il peut être utile de réfléchir à la dimensionnalité des entrées et des sorties des différentes fonctions.

Un vecteur en entrée, un scalaire en sortie

On a déjà vu des fonctions qui prennent un vecteur en entrée et renvoient une seule valeur, de type scalaire :

v <- 1:5
length(v)
#> [1] 5
sum(v)
#> [1] 15

De nombreuses fonctions statistiques entrent aussi dans cette catégorie, comme mean().

Pour les vecteurs logiques, il y a all() et any(), qui renvoient un seul TRUE ou FALSE.

Un vecteur en entrée, un vecteur en sortie

De nombreuses fonctions en R opèrent sur des vecteurs entiers, en renvoyant souvent un vecteur en sortie. C'est le cas de la plupart des fonctions mathématiques :

sq <- c(4, 9, 16, 25)
sqrt(sq) # square root
#> [1] 2 3 4 5

Ce n'est pas seulement concis et pratique, en évitant le recours aux boucles, aux compréhensions de liste ou à la récursivité, courantes dans d'autres langages. En R, les fonctions vectorielles sont souvent bien plus rapides que ces techniques.

Tu as déjà utilisé des fonctions vectorisées bien plus que tu ne l'imagines sans doute. Compare ces deux versions :

v <- c(2, 7, 9)
w <- c(3, 1, 5)
v + w
#> [1]  5  8 14
"+"(v, w)
#> [1]  5  8 14

Les opérateurs infixes que tu connais ne sont que du sucre syntaxique pour la fonction vectorisée sous-jacente ! Ici, "+"().

Pour trier un vecteur, sort() renvoie les valeurs et order() renvoie les indices :

v <- c("I", "am", "not", "in", "order")
sort(v)
#> [1] "am"    "I"     "in"    "not"   "order"
order(v)
#> [1] 2 1 4 3 5

Par défaut, le tri se fait par ordre croissant. Indique decreasing = TRUE si nécessaire, ou utilise rev() pour inverser un vecteur existant.

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

Il existe aussi des fonctions comme cumsum() et cumprod() qui produisent des vecteurs de résultats cumulés, en parcourant le vecteur d'entrée de gauche à droite :

cumsum(1:5)
#> [1]  1  3  6 10 15  # sums
cumprod(1:5)
#> [1]   1   2   6  24 120 # equivalent to factorials

Les exemples ci-dessus ressemblent aux opérations foldl de nombreux langages fonctionnels, à ceci près que la sortie est un vecteur contenant toutes les valeurs intermédiaires.

Plusieurs vecteurs en entrée, un vecteur en sortie

Ce concept peut aussi s'étendre à la comparaison de vecteurs. Par exemple, considérons la fonction de maximum par paire pmax() :

v
#> [1] 2 7 9
w
#> [1] 3 1 5
pmax(v, w)
#> [1] 3 7 9 # max of each pairwise comparison

Cette fonction, comme d'autres du même genre, accepte un nombre arbitraire de vecteurs en entrée, et pas seulement deux.

L'exemple ci-dessus utilise des vecteurs de même longueur. Comme nous l'avons vu dans le concept Filtrage de vecteurs, R a recours au recycling pour étendre les vecteurs qui sont, d'une manière ou d'une autre, « trop courts ». Pour le répéter : à utiliser avec prudence, et de préférence uniquement avec un vecteur de longueur 1.

pmax(v, 5)
#> [1] 5 7 9

Un vecteur en entrée, une matrice en sortie

C'est moins courant, mais il est assez facile d'écrire des fonctions qui semblent prendre un scalaire en entrée et renvoyer un vecteur en sortie. Appliquées à un vecteur en entrée, ces fonctions renvoient une matrix à 2 dimensions (abordée dans un concept ultérieur).

Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet

Apprends Fonctions vectorielles