STTRUCTURES DE CONRÔLE EN R
MODULE 3
MODULE 3
MODULE 3
MODULE 3
44
Conditions et boucles
Conditions et boucles
Conditions et boucles
Conditions et boucles
Conditions et boucles
Conditions et boucles
Conditions et boucles
Conditions et boucles
• Instructions conditionnelles
• Boucles for
• Boucles while
CONDITIONS ET BOUCLES
45
Instructions if
• L’instruction if
year <- 2002
if (year > 2000) {
print ('year is greater than 2000')
}
[1] year is greater than 2000
• On peut ajouter un bloc else à l’instruction if
• On peut ajouter un bloc else à l’instruction if
year <- 1997
if (year > 2000) {
print ('year is greater than 2000')
} else {
print ('year is not greater than 2000')
}
[1] year is not greater than 2000
CONDITIONS ET BOUCLES
46
Opérateurs logiques
• Les opérateurs logiques servent à comparer deux valeurs et le résultats
est TRUE ou FALSE.
1995 > 1987
[1] TRUE
1995 < 1987
[1] FALSE
2016 >= 1987
[1] TRUE
'Toy Story' == 'Toy Story'
[1] TRUE
'Toy Story' != 'Toy Boy'
[1] TRUE
CONDITIONS ET BOUCLES
47
Combinaison d’opérateurs logiques
• On peut combiner des opérateurs logiques à l’aide des opérateurs OU,
ET …
'Toy Story' == 'Toy Story' & 1995 < 1987
[1] FALSE
CONDITIONS ET BOUCLES
48
Opérateurs de comparaison et logiques
Opérateur
Signification
==
!=
>
<
>=
>=
<=
&
|
!
Est égal à
Est différent de
Est supérieur à
Est inférieur à
Est supérieur ou égal à
Est supérieur ou égal à
Est inférieur ou égal à
ET
OU
NON
%in%
Est contenu dans
CONDITIONS ET BOUCLES
49
Instruction for
• Utilisées pour parcourir toutes les valeurs d’un vecteur
years <- c(1995, 1998, 1985, 2011, 1936, 1999)
for (ys in years) {
print (yr)
}
[1] 1995
[1] 1998
[1] 1985
[1] 1985
[1] 2011
[1] 1936
[1] 1999
CONDITIONS ET BOUCLES
50
Instruction for
• On peut combiner les instructions for avec le bloc if / else
years <- c(1995, 1998, 1985, 2011, 1936, 1999)
for (ys in years) {
if (yr < 1980) {
print ('Old movie')
} else {
print ('Not that old')
}
}
}
[1] Not that old
[1] Not that old
[1] Not that old
[1] Not that old
[1] Old movie
[1] Not that old
Advertisement
CONDITIONS ET BOUCLES
51
Instructions while
• Dans une instruction while, l’exécution continue tant que la condition
entre parenthèses est vraie
count <- 1
while (count <= 5) {
print (c ("Iteration number:", count))
count <- count + 1
}
[1] "Iteration number:" "1"
[1] "Iteration number:" "1"
[1] "Iteration number:" "2"
[1] "Iteration number:" "3"
[1] "Iteration number:" "4"
[1] "Iteration number:" "5"
CONDITIONS ET BOUCLES
52
Les fonction dans R
Les fonction dans R
Les fonction dans R
Les fonction dans R
Les fonction dans R
Les fonction dans R
Les fonction dans R
Les fonction dans R
• Une fonction est un bloc de code qui peut être réutilisé dans différents
endroits d’un programme.
• Il y a des foncions prédéfinies et des fonctions
définies par le
programmeur.
LES FONCTIONS DANS R
53
Les fonctions prédéfinies
• Les fonctions prédéfinies sont des fonctions intégrées au langage ou
fournies dans des packages séparés.
• Dans le code qui suit, nous utilisons la fonction prédéfinie mean pour
calculer la moyenne d’une séquence de valeurs.
ratings <- c(8.7, 6.9, 8.5)
mean (ratings)
[1] 8.033333
[1] 8.033333
• Dans le code suivant nous utilisons la fonction prédéfinie sort pour trier
le vecteur. Le tri s’effectue par défaut dans l’ordre ascendant
sort (ratings)
[1] 6.9 8.5 8.7
sort (ratings, decreasing=TRUE)
[1] 8.7 8.5 6.9
LES FONCTIONS DANS R
54
Fonctions définies par l’utilisateur
• Le code suivant définit une fonction nommée printHelloWorld.
printHelloWorld <- function () {
print ("Hello World")
}
printHelloWorld()
[1] "Hello World"
• La fonction peut recevoir des arguments.
add <- function (x, y) {
x + y
}
add(3, 4)
[1] 7
LES FONCTIONS DANS R
55
Retour de résultat explicite
• L’instruction return est utilisé pour afficher explicitement un résultat
d’une fonction.
add <- function (x, y) {
return (x + y)
}
add(3, 4)
[1] 7
[1] 7
• Lorsque l’instruction return est rencontré, n'importe où dans la fonction,
la valeur correspondante sera produite et la fonction se termine.
• Gardez à l'esprit que si
la fonction n'a pas d'instruction de return, R
renverra automatiquement la valeur de la dernière expression évaluée
LES FONCTIONS DANS R
56
if / else dans les fonctions
• L'instruction return est particulièrement utile lorsque vous avez besoin
/ else, car la valeur de sortie finale dépendra d'une
d'un bloc if
condition.
isGoodRating <- function (rating) {
if (rating < 7) {
return ("NO")
} else {
return ("YES")
return ("YES")
}
}
isGoodRating (6)
[1] "NO"
isGoodRating (9.5)
[1] "YES"
LES FONCTIONS DANS R
57
Valeurs par défaut de paramètres
• Si vous le souhaitez, vous pouvez définir une valeur par défaut pour un
argument de fonction.
isGoodRating <- function (rating, threshold = 7) {
if (rating < threshold) {
return ("NO")
} else {
return ("YES")
}
}
}
• Dans la définition de la fonction, nous avons ajouté threshold = 7.
Lorsque nous appelons cette fonction, il suffit de spécifier le paramètre
rating. R utilisera automatiquement la valeur de 7 pour threshold.
isGoodRating (8)
[1] "YES"
LES FONCTIONS DANS R
58
Advertisement
Valeurs par défaut de paramètres
• Cependant, vous pouvez également remplacer la valeur par défaut,
comme suit. Maintenant que 8 est inférieur à la valeur spécifiée de 8.5,
la fonction retournera "NO" comme sortie.
isGoodRating (8, threshold = 8.5)
[1] "NO"
LES FONCTIONS DANS R
59
Appel de fonctions à l’intérieur d’autres fonctions
• Vous pouvez utiliser des fonctions dans d'autres fonctions.
• Voyons d'abord la fonction principale que nous allons construire. La
fonction recevra un nom de film et un seuil, et elle déterminera s'il faut
regarder le film en retournant YES ou NO.
• La fonction vérifiera une base de données pour la note moyenne du
film.
film.
• Cette note, avec le seuil par défaut de 7, sera transmise à la fonction
isGoodRating précédemment définie.
• La sortie finale de la fonction dépendra de la sortie de isGoodRating.
LES FONCTIONS DANS R
60
Appel de fonctions à l’intérieur d’autres fonctions
• La fonction s'appelle watchMovie et prend en arguments le nom du film,
ainsi qu'un seuil de classement.
• "my_data" est un data frame contenant des données sur des films.
• La première colonne contient les titres des films.
• La colonne nommée average_rating indique la note moyenne attribuée
pour chaque film dans le data frame.
pour chaque film dans le data frame.
• La 1ère ligne est chargée d'extraire la note du film de la base du data
frame. Elle trouve un nom correspondant dans la colonne name, puis la
valeur average_rating dans la ligne correspondante.
• La 2ème ligne passe le rating calculé ainsi que la valeur de my_threshold
à la fonction isGoodRating.
LES FONCTIONS DANS R
61
Appel de fonctions à l’intérieur d’autres fonctions
• La fonction watchMovie :
watchMovie <- function (movie_name, my_threshold = 7) {
rating <- my_data [my_data [, 1] == movie_name, "average_rating"]
isGoodRating (rating, threshold = my_threshold)
}
watchMovie ("Akira")
watchMovie ("Akira")
[1] "YES"
watchMovie ("Akira" , 8)
[1] "YES"
LES FONCTIONS DANS R
62
Variables globales et variables locales
myFunction <- function () {
y <<- 3.5
temp <- "Hello World"
return (temp)
}
• Les variables peuvent être définies à l'intérieur des fonctions.
• La fonction ci-dessus, lorsqu'elle est exécutée, affichera simplement
• La fonction ci-dessus, lorsqu'elle est exécutée, affichera simplement
"Hello World".
• Mais regardez de plus près les variables y et temp.
LES FONCTIONS DANS R
63
Variables globales et variables locales
myFunction <- function () {
y <<- 3.5
temp <- "Hello World"
return (temp)
}
• Si vous essayez d'accéder à y en dehors de la fonction, vous
remarquerez que la sortie est 3.5.
• Mais si vous essayez d'accéder à temp, vous obtenez une erreur à la
place. C'est parce qu'il y a une différence dans la façon dont ces
variables sont définies.
LES FONCTIONS DANS R
64
Variables globales et variables locales
myFunction <- function () {
y <<- 3.5
temp <- "Hello World"
return (temp)
}
• "temp" utilise l'opérateur d'affectation de variable standard <-.
• L'opérateur utilisé pour "y" a une "flèche gauche" supplémentaire <<-.
• L'opérateur utilisé pour "y" a une "flèche gauche" supplémentaire <<-.
• Cela signifie que "y" est défini comme une variable globale, donc il est
accessible en dehors de la fonction.
• "temp" en revanche est local, il n'est donc accessible qu'à l'intérieur de
la fonction.
LES FONCTIONS DANS R
65
Variables globales et variables locales
myFunction <- function () {
y <<- 3.5
temp <- "Hello World"
return (temp)
}
myFunction ()
[1] "Hello World"
y
[1] 3.5
temp
Error in eval(expr, envir, enclos): object temp not found
LES FONCTIONS DANS R
66
Objets et Classes
Objets et Classes
Objets et Classes
Objets et Classes
Objets et Classes
Objets et Classes
Objets et Classes
Objets et Classes
• Un objet est une structure qui a des attributs et des méthodes qui
agissent sur ces attributs.
x <- 5
• Dans l'exemple ci-dessus, la variable «x» fait référence à un objet qui
porte la valeur «5» quelque part en mémoire. L'attribut de l'objet qui
spécifie son type est appelé sa «classe».
Advertisement
spécifie son type est appelé sa «classe».
• Il existe plusieurs classes dans R qui sont fréquemment utilisées.
– Classe numeric utilisée pour les valeurs réelles.
– Classe character utilisée pour les chaînes de caractères.
– Classe logical utilisée pour les valeurs TRUE et FALSE.
– Classe integer utilisée pour les valeurs entières.
OBJETS ET CLASSES
67
Classe numeric
average_rating <- 8.3
[1] 8.3
• Dans l’exmple nous avons créé une variable pour contenir la valeur
décimale, "8.3".
• Dans R, les objets qui contiennent des valeurs décimales sont numeric
par défaut.
par défaut.
• Nous pouvons utiliser la fonction class pour vérifier le type de l'objet.
class (average_rating)
[1] "numeric"
OBJETS ET CLASSES
68
Classe character
• la classe character est utilisée pour les chaînes ou le texte.
movies <- c ("Toy Story", "Akira")
[1] "Toy Story" "Akira"
• Ici, nous avons créé un tableau de deux chaînes de caractères.
• Si nous exécutons la fonction class, nous voyons que le type de l'objet
est character .
est character .
class (movies)
[1] "character"
OBJETS ET CLASSES
69
Classe logical
• La classe logical est destinée aux valeurs booléennes, qui sont soit
TRUE soit FALSE.
• Nous pouvons donc créer un vecteur de valeurs TRUE et FALSE, et
lorsque nous exécutons la fonction class, nous voyons que le type
d'objet est logical.
logical_vector <- c (TRUE, FALSE, FALSE, TRUE, TRUE)
logical_vector <- c (TRUE, FALSE, FALSE, TRUE, TRUE)
[1] TRUE FALSE FALSE TRUE TRUE
class (logical_vector)
[1] "logical"
OBJETS ET CLASSES
70
Classe integer, de numeric vers integer
• Les entiers (integer) sont les nombres qui peuvent être écrits sans
composant fractionnaire.
• Mais il est important de se souvenir de ce que nous avons mentionné
précédemment à propos de numeric étant la valeur par défaut pour les
nombres.
age_restriction <- c (12, 10, 16, 18)
[1] 12 10 16 18
class (age_restriction)
[1] "numeric"
• Comme vous pouvez le voir, le type est numeric plutôt que integer.
OBJETS ET CLASSES
71
Classe integer, de numeric vers integer
• Afin de convertir des données de type numeric dans la classe integer,
nous devons utiliser la fonction as.integer.
• On passe notre vecteur de type numeric à la fonction as.integer et on
affecte le résultat à un nouveau vecteur.
integer_vector <- as.integer (age_restriction)
class (integer_vector)
class (integer_vector)
[1] "integer"
• Il existe également
classe numeric.
la fonction as.numeric pour la reconversion en
OBJETS ET CLASSES
72
Conversion vers la classe character
• Si vous souhaitez convertir un nombre dans la classe character, vous
pouvez utiliser la fonction as.character.
year <- as.character (1995)
[1] "1995"
• Notez que l'entrée de la fonction est le nombre 1995. Quand nous
regardons la sortie, nous pouvons voir que le nombre est maintenant
regardons la sortie, nous pouvons voir que le nombre est maintenant
une chaîne.
OBJETS ET CLASSES
73
Combiner des nombre et des chaînes dans un vecteur
• Les vecteurs sont destinés à stocker uniquement des données du
même type.
• Observons l’extrait de code qui suit où nous essayons de créer un
vecteur qui combine des types de caractères avec des types
numériques.
combined <- c ("Toy Story", 1995 "Akira", 1998)
combined <- c ("Toy Story", 1995 "Akira", 1998)
[1] "Toy Story" "1995" "Akira" "1998"
OBJETS ET CLASSES
74
Combiner des nombre et des chaînes dans un vecteur
• En se basant sur
l’affichage, nous voyons que R convertit
automatiquement les types numeric en types character.
• Et si nous passons ce vecteur dans la fonction classe, nous pouvons
confirmer que c'est bien le cas.
class (combined)
[1] "character"
[1] "character"
OBJETS ET CLASSES
75
Débogage
Débogage
Débogage
Débogage
Débogage
Débogage
Débogage
Débogage
• Si vous essayez d'effectuer une opération non valide, R vous alertera
avec le message d'erreur approprié.
• Considérez le morceau de code suivant. Notez que nous essayons
d'ajouter un type de caractère et un nombre ensemble.
Advertisement
"a" + 10
Error in "a" + 10: non-numeric argument to binary operator
Error in "a" + 10: non-numeric argument to binary operator
• Lors de l'exécution, nous voyons dans la sortie d'erreur que l'un des
arguments n'est pas numérique.
• Une erreur arrêtera l'exécution du code.
DÉBOGAGE
76
Débogage
• Si vous regardez le code suivant, vous verrez que nous avons une
boucle for qui, dans des circonstances normales, s'exécuterait trois fois.
• Mais lorsque l'erreur est rencontrée, un message d'erreur est émis et le
code s'arrête immédiatement.
for (i in 1:3) {
print (i + "a")
}
}
Error in i + "a" : non-numeric argument to binary operator
• Les deux exemples précédents étaient simples, mais ces erreurs
peuvent souvent être difficiles à localiser dans un grand volume de
code.
Le processus de recherche de la source de ces bogues de
programmation et de leur résolution est appelé débogage.
•
DÉBOGAGE
77
Capture d’erreur avec tryCatch
• Si vous savez qu'une erreur peut se produire, vous pouvez intercepter
l'erreur pendant qu'elle se produit pour éviter l'arrêt de votre script.
• Pour ce faire, on a recours à l’instruction tryCatch.
• Une instruction tryCatch exécutera le code normalement, en supposant
qu'il n'y a pas d'erreurs impliquées.
• L’extrait de code qui suit est une exécution normale de tryCatch.
• L’extrait de code qui suit est une exécution normale de tryCatch.
tryCatch (10 + 10)
[1] 20
DÉBOGAGE
78
Capture d’erreur avec tryCatch
• Si nous revenons à notre déclaration d'addition invalide, le tryCatch
alertera que cela n'est pas valide.
tryCatch ("a" + 10)
Error in "a" + 10: non-numeric argument to binary operator
• Au début, il peut sembler que rien de nouveau ne s'est produit, mais
tryCatch a une manière spéciale de traiter ces types de problèmes.
tryCatch a une manière spéciale de traiter ces types de problèmes.
DÉBOGAGE
79
Capture d’erreur avec tryCatch
• Observez bien la syntaxe ci-dessous. Notez que nous avons ajouté une
instruction d'impression personnalisée à l'intérieur des parenthèses.
• Si
l'instruction tryCatch détecte une erreur, elle exécutera le code
personnalisé au lieu d'imprimer le message d'erreur par défaut.
tryCatch ("a" + 10, error = function (e) print ("Something went wrong with the script!"))
[1] "Something went wrong with the script!"
[1] "Something went wrong with the script!"
• Cependant, si tout va bien, comme lorsque nous pour l’instruction 10 +
10, aucune erreur ne sera générée et tout fonctionnera normalement.
tryCatch (10 + 10, error = function (e) print ("Something went wrong with the script!"))
[1] 20
DÉBOGAGE
80
Capture d’erreur avec tryCatch
• Vous pouvez aussi
renvoyer une valeur, plutôt que d'exécuter
simplement une instruction d'impression.
tryCatch ("a" + 10, error = function (e) return ("a10"))
[1] "a10"
• Notez dans l’exemple ci-dessus que lorsque l'erreur est générée, nous
renvoyons simplement une chaîne concaténée des deux valeurs.
renvoyons simplement une chaîne concaténée des deux valeurs.
DÉBOGAGE
81
Capture d’erreur avec tryCatch
• Reconsidérons notre exemple précédent avec la boucle for.
tryCatch (
for (i in 1:3) {
print (i + "a")
}
, error = function (e) print ("Error found!"))
[1] "Error found!"
• Le code à l'intérieur de l'instruction tryCatch s'exécutera jusqu'à ce
qu'une erreur soit trouvée.
• Une fois la première erreur trouvée,
le tryCatch ne reprendra pas
l'exécution du code principal entre parenthèses.
• Notre message personnalisé n'est donc imprimé qu'une seule fois,
plutôt que trois fois.
DÉBOGAGE
82
Traitement des avertissements (warnings)
• Une instruction tryCatch permet également de détecter les messages
warning.
• Contrairement à une erreur, un warning n'arrêtera pas le code, mais il
suggère généralement que quelque chose d'indésirable se produit.
• Par exemple, si vous regardez le code suivant , vous pouvez voir que
nous passons la lettre "A" à la fonction as.integer et R fournit
nous passons la lettre "A" à la fonction as.integer et R fournit
l'avertissement affiché ici.
as.integer ("A")
Warning message: In eval(expr, envir, enclos): NAs introduced by coercion
DÉBOGAGE
83
Traitement des avertissements (warnings)
• La syntaxe pour intercepter un warning est similaire à la syntaxe
d'avant. Notez à nouveau que nous avons fourni une instruction
d'impression personnalisée lorsque le warning se produit.
tryCath(as.integer ("A"),
warning = function (e) print ("Warning!"))
{1] "Warning!"
DÉBOGAGE
84