Structures de Contrôle en R

Programming, R programming, Control Structures · course

Voir tous les documents en programmation

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

Publicité

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

Publicité

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».

Publicité

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.

Publicité

"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