Parcours
/
R
R
/
Exercices
/
Observateur d'oiseaux
Observateur d'oiseaux

Observateur d'oiseaux

Exercice d'apprentissage

Introduction

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.

Vecteur en entrée, 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 appartiennent aussi à cette catégorie, comme mean().

Pour les vecteurs logiques, il y a all() et any().

Vecteur en entrée, vecteur en sortie

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

Plusieurs vecteurs en entrée, vecteur en sortie

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

Instructions

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.

1. Vérifie combien d'oiseaux sont venus aujourd'hui

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

2. Incrémente le comptage d'aujourd'hui

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)

3. Vérifie s'il y a eu un jour sans oiseau

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

4. Calcule le nombre d'oiseaux venus pendant les premiers jours

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

5. Calcule le nombre de jours chargés

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

6. Calcule le total cumulé des visites d'oiseaux sur la dernière semaine

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

7. Trie les noms des jours selon leur fréquentation

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"
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
R Exercism

Prêt à commencer Observateur d'oiseaux ?

Inscris-toi sur Exercism pour apprendre et maîtriser R avec 21 concepts111 exercices, et un vrai mentorat humain, le tout gratuitement.