C'est un concept important en R. Pour mieux s'y retrouver parmi toutes les possibilités, il peut être utile de considérer la dimensionnalité des entrées et des sorties des différentes fonctions.
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 appartiennent aussi à cette catégorie, comme mean().
Pour les vecteurs logiques, il y a all() et any().
De nombreuses fonctions en R opèrent sur des vecteurs entiers et renvoient 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, ce qui évite d'avoir recours à des boucles, des compréhensions de listes ou de la récursion, courantes dans d'autres langages. En R, les fonctions vectorielles sont souvent bien plus rapides que ces techniques.
Pour trier un vecteur, il y a sort() qui renvoie les valeurs et order() qui 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.
Précise 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 qui produisent des sorties vectorielles cumulatives, 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
Une extension de ce concept permet aussi de comparer des 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
Tu es un passionné d'observation des oiseaux qui note combien d'oiseaux ont visité ton jardin au cours des sept derniers jours.
Tu as six tâches, toutes portant sur le nombre d'oiseaux venus dans ton jardin.
Implémente la fonction today() pour qu'elle renvoie combien d'oiseaux ont visité ton jardin aujourd'hui. Les comptages d'oiseaux sont ordonnés par jour, le premier élément étant le comptage du jour le plus ancien et le dernier élément celui d'aujourd'hui.
birds_per_day <- c(2, 5, 0, 7, 4, 1)
today(birds_per_day)
# => 1
Implémente la fonction increment_todays_count() pour incrémenter le comptage d'aujourd'hui :
birds_per_day <- c(2, 5, 0, 7, 4, 1)
increment_todays_count(birds_per_day)
# => c(2, 5, 0, 7, 4, 2)
Implémente la fonction has_day_without_birds() qui renvoie TRUE s'il y a eu un jour où aucun oiseau n'a visité le jardin ; sinon, elle renvoie FALSE :
birds_per_day <- c(2, 5, 0, 7, 4, 1)
has_day_without_birds(birds_per_day)
# => true
Implémente la fonction count_for_first_days() qui renvoie le nombre d'oiseaux venus dans ton jardin depuis le début de la semaine, mais limite ce comptage au nombre de jours indiqué à partir du début de la semaine.
birds_per_day <- c(2, 5, 0, 7, 4, 1)
count_for_first_days(birds_per_day, 4)
# => 14
Certains jours sont plus chargés que d'autres. Un jour chargé est un jour où cinq oiseaux ou plus sont venus dans ton jardin.
Implémente la fonction busy_days() pour qu'elle renvoie le nombre de jours chargés :
birds_per_day <- c(2, 5, 0, 7, 4, 1)
busy_days(birds_per_day)
# => 2
Tu te demandes combien d'oiseaux ont visité ton jardin en tout depuis le début de la semaine. Calcule les totaux cumulés pour chaque jour.
running_total(c(7, 6, 5, 4, 3, 2, 1))
#> [1] 7 13 18 22 25 27 28
Tu soupçonnes que les visites d'oiseaux sont influencées par le trafic routier des environs, qui n'est pas le même le week-end et en semaine.
Trie les abréviations des jours par ordre décroissant du nombre d'oiseaux venus.
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"
Inscris-toi sur Exercism pour apprendre et maîtriser R avec 21 concepts111 exercices, et un vrai mentorat humain, le tout gratuitement.