This repository was archived by the owner on May 17, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathREADME.Rmd
More file actions
275 lines (170 loc) · 11.2 KB
/
README.Rmd
File metadata and controls
275 lines (170 loc) · 11.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
---
title: "Les fonctions"
subtitle: "Science des données V : recherche reproductible"
output: github_document
---
### Objectifs
- Appréhender les notions liées aux fonctions
- Apprendre à écrire des fonctions
- Apprendre à documenter une fonction
### Organisation du dépôt
Ce dépot est directement lié au dépôt suivant <TODO> qui vous propose des notions théoriques sur l'utilisation, l'écriture et la documentation d'une fonction.
Ce dépot comprend :
- une fichier README.md qui reprend l'ensemble des exercices que vous devez réaliser afin de mener à bien ce travail.
- un dossier R qui comprend l'ensemble des fonctions que vous devez réaliser/analyser au cours de ce module
- un dossier vignettes qui comprend la documentation liée à vos fonctions
- un dossier notebook qui comprend vos notes personnelles sur ce module.
### Introduction
Les fonctions sont, dans R, les briques de construction. Si vous répétez des blocs de codes plus de deux fois, il faut réaliser une fonction. Mais c'est quoi une fonction ? Vous en utilisez en permanence dans R. Nous allons progressivement réaliser nos propres fonctions étape par étape.
L'utilisation de fonctions a plusieurs avantages
- On évite de répéter des blocs de codes plusieurs fois
- On limite les possibilités de bug
- On rend notre code plus lisible
- ...
### Structure d'une fonction
Une fonction se présente comme ci dessous :
```
my_function(arg1, arg2)
```
La fonction porte un nom suivi de parenthèse. A l'intérieur des parenthèses, on retrouve les arguments de la fonction
### Ecriture d'une fonction
L'écriture d'une fonction respecte les conventions ci-dessous :
```
my_function <- function(arg1, arg2){
# Mon bloc de code répété
}
```
Dans le dossier R, vous trouvez le script que se nomme `amount.R`.
> Analisez une fonction qui permet de réaliser la somme de 2 termes. Ajoutez vos analyse au sein de votre fichier personnel ``fonction_note.Rmd.`
#### Exemples
Prenons le cas par exemple de la fonction sd() qui permet de calculer l'écart-type d'un échantillon. La fonction sd() ne respecte par exemple pas la règle des fonctions se nomme avec un verbe. On peut également retrouver des noms d'arguments communs comme `na.rm` pour spécifier la présence de valeurs manquantes (on retrouve cet argument dans de nombreuses fonctions).
```
vec <- 1:10
sd(x = vec, na.rm = FALSE)
```
Pour le plaisir de se rapeller la formule mathématique, l'écart-type s'obtient de la manière suivante :
$$s_x = \sqrt{\sum_{i=1}^n{\frac{(x_i - \bar{x})^2}{n-1}}}$$
Notons que $s^2$ est également appelée la **variance** de l'échantilon^[L'équation proposée est, en fait, valable pour un échantillon, et est calculé comme tel par R à l'aide des fonctions `sd()` pour l'écart type ou `var()` pour la variance.
#### Exercice : cv()
> Dans le dossier R, réalisez une fonction permettant de calculer le coefficient de variation d'un vecteur de nombre en pourcent. Le script R est préparé pour vous. Vous n'avez plus qu'à le compléter.
Si jamais tu as oublié, la formule qui permet de calculer le coefficient de variation d'un échantillon est la suivante :
$$CV (\%) = \frac{s_x}{\bar{x}} \ \times 100$$
#### Exercice : rescale01()
> Dans le dossier R, réalisez une fonction permettant de redimensionner un vecteur entre 0 et 1. Inspirez vous des fonctions présentées précédement. Le script R est préparé pour vous. Vous n'avez plus qu'à le compléter.
La formule mathématique qui permet de réaliser cette fonction est la suivante :
$$x_{redim} = \frac{(x - valeur \ minimum \ de \ x)}{( valeur \ maximum \ de \ x - valeur \ minimum \ de \ x)}$$
### Documentation d'une fonction
La documentation d'une fonction est une étape souvent négligée. Cependant, une fonction bien documentée est une fonction qui sera employée à l'avenir. Les fonctions mal documentées sont des fonctions qui seront généralement peu employées, souvent mal employées et enfin oubliées.
Nous avons pu observer que les fonctions sont documentées au sein de nos différents scripts R avec un système de balisage particulier qu'il est indispensable de respecter. Ces conventions de documentation sont indispensables lorsque l'on souhaite regrouper diverses fonctions au sein d'un package. Malheureusement, nous n'aborderons pas les notions de package au sein de ce module.
La documentation des fonctions reste néanmoins assez sommaire comme vous pouvez le voir avec les exemples ci-dessous :
```
?sd()
?dplyr::filter()
```
Afin de proposer une documentation plus détaillée, l'utilisation des vignettes s'est répandue. La fonction vignette() permet de prendre connaissance des vignettes disponibles au sein d'un package
```
# Pour prendre connaissance des vignettes disponible dans un package
vignette(package = 'dplyr')
# Visualiser une vignette particulière
vignette("dplyr", package = 'dplyr')
```
Une bonne pratique est de réaliser une vignette pour décrire l'objectif de la fonction, puis les différentes étapes qui mène à l'écriture de cette fonction et enfin d'y ajouter plusieurs exemples mis en contexte. Lorsque votre fonction est décrite et écrite et testée, il est temps de la placer dans un script R. Attention, l'écriture d'une vignette ne dispense pas d'écrire la documentation de manière synthétisée dans le script.
#### Exemple
Prenons le cas par exemple de la fonction skeleton_weight() qui est documentée dans le fichier `skeleton_weight_french.Rmd`.
> Dans le dossier vignettes, analysez la structure du document `skeleton_weight_french.Rmd`. Ajoutez vos analyses et remarques au sein de votre fichier personnel `fonction_note.Rmd`. Dans le dossier R, analysez ensite la fonction skeleton_weight() dans le fichier `skeleton_weight.R`.
#### Exercice : reg_lin()
La fonction reg_lin() a pour objectif de calculer une valeur y qui suit une regression linéaire simple en partant d'une valeur x, d'une valeur de pente et d'une valeur d'ordonnée à l'origine. Nous pouvons donc écrire l'équation de notre régression linéaire simple.
$$y = a \times x + b$$
Avec a comme pente et b comme ordonnée à l'origine.
> Dans le dossier vignettes, un début de vignette a été réalisé afin de vous permettre de réaliser et documenter la fonction reg_lin(). Une fois, la fonction documentée et réalisée, ajoutez votre fonction dans un script reg_lin.R
### Excécution conditionnelle
Lors de la réalisation de vos fonctions, vous serez amené à exécuter du code de manière conditionnelle
```
if (condition) {
# Code exécuté si la condition est vérifiée
} else {
# code exécuté si la condition es infirmée
}
```
Une page d'aide est dédiée à l'utilisation des if
```
?`if`
```
Il est bien sur possible de réaliser des conditons multiples
```
if (condition) {
# Code exécuté si la condition est vérifié
} else if(condition) {
# Autre code a éxécuter si la condition est vérifié
} else {
# code ...
}
```
#### Exercice : `trimester()`
La fonction trimester() a pour objectif de convertir un vecteur de mois en un vecteur de trimestre.
| Mois | Mois (numérique) | Trimestre |
| --------- | ---------------- | --------- |
| janvier | 1 | 1 |
| février | 2 | 1 |
| mars | 3 | 1 |
| avril | 4 | 2 |
| mai | 5 | 2 |
| juin | 6 | 2 |
| juillet | 7 | 3 |
| aout | 8 | 3 |
| septembre | 9 | 3 |
| octobre | 10 | 4 |
| novembre | 11 | 4 |
| décembre | 12 | 4 |
> Dans le dossier vignettes, un début de vignette a été réalisé afin de vous permettre de réaliser et documenter la fonction trimester(). Une fois, la fonction documentée et réalisée, ajoutez votre fonction dans un script trimester.R
#### Exercice : `real_feel()`
La fonction real_feel() a pour objectif de convertir un vecteur de température en un vecteur de température ressentie.
| Température | Température ressentie |
| ----------- | --------------------- |
| <= 0 | glacial |
| <= 10 | froid |
| <= 20 | frais |
| <=30 | chuad |
| > 30 | torride |
> Dans le dossier vignettes, un début de vignette a été réalisé afin de vous permettre de réaliser et documenter la fonction real_feel(). Une fois, la fonction documentée et réalisée, ajoutez votre fonction dans un script real_feel.R
#### Exercice : `fizzbuzz()`
La fonction fizzbuzz a pour objectif de convertir un vecteur d'entier positif en un vecteur de caractères
- Si l'entier est divisible par 3 : `fizz`
- Si l'entier est divisible par 5 : `buzz`
- Si l'entier est divisible par 3 et par 5 : `fizzbuzz`
- Si la valeur n'est ni divisisble par 3 ou par 5 : `ND`
> Dans le dossier vignettes, un début de vignette a été réalisé afin de vous permettre de réaliser et documenter la fonction fizzbuzz(). Une fois, la fonction documentée et réalisée, ajoutez votre fonction dans un script fizzbuzz.R
### Tester une fonction
Nous avons réalisé différentes fonctions cv(), rescale01(), trimester(), real_feel(), fizzbuzz(). Nous allons tester nos fonctions et tenter de penser à toutes les erreurs que l'on pourrait réaliser avec cette fonction.
Pour débuter notre réflexion, tetons d'exécuter la fonction cv() avec les vecteurs suivants :
```
# test 1
vec <- c(rnorm(14), Inf)
# test 2
vec <- c(rnorm(14), NA)
# test 3
vec <- c(rnorm(14), "t")
# test 4
vec <- -4:5
```
Si la fonction ne nous renvoie pas la valeur, le message ou l'erreur attendue, il faut améliorer notre fonction à la suite de chaque test. à l'intérieur de notre fonction, il est possible d'intégrer des tests
```
if (condition)
stop("message d'erreur explicite")
# ou encore
if(condition)
warning("message explicite")
```
Par exemple si l'on souhaite ajouter un test qui vérifie que notre vecteur ne comprend que des valeur numérique, on peut ajouter un test de ce type
```
if (!is.numeric(x))
stop("x must be numeric")
```
> Testez vos différentes fonctions et adaptez-les ci-cela est nécessaire
La programmation défénsive a pour but d'arreter le plus vite possible une fonction lors de la présence d'une erreur avec un message explicite. Le package `testthat` permet de tester vos fonctions avec des fonctions comme `expect_equal()` ou encore `expect_error()`. N'hésitez pas à ajouter ce fonction de test dans votre vignettes par exemple.
### Optimiser une fonction
Nos différentes fonctions sont écrites, documentée et testée. Nous avons donc atteint une étape importante dans la création de fonction. On peut néanmoins se poser les questions suivantes :
- Est ce que ma fonction est optimisée ?
- N'existe t'il pas une autre manière d'écrire notre fonction afin qu'elle soit plus lisible ?
- N'existe t'il pas une autre manière d'écrire notre fonction afin qu'elle soit éxécutée plus rapidement ?
> Essayer d'optimiser vos fonctions en débutant par la fonction trimester(). Afin de réaliser vos comparaison de fonction, utilisez la fonction `bench::mark()`