TP5

Programming, Math, etc. · exam

Voir tous les documents en programmation

TP5

Table des matières

• Qu'est-ce qu'une fonction ?

• Renvoi explicite des résultats dans des fonctions définies par l'utilisateur

• Utilisation des déclarations IF/ELSE dans les fonctions

• Définition de valeurs d'arguments par défaut dans vos fonctions personnalisées

• Utiliser les fonctions dans les fonctions

• Variables globales et locales

Estimation du temps nécessaire : 25 min

Qu'est-ce qu'une fonction ?

Une fonction est un bloc de code réutilisable qui exécute les opérations spécifiées dans la fonction. Il existe deux types de

fonctions :

• Les fonctions prédéfinies

• Fonctions définies par l'utilisateur

Les fonctions prédéfinies sont celles qui sont déjà définies pour vous par le langage ou des librarires. Par exemple, sum() est

une fonction prédéfinie qui renvoie la somme de ses entrées numériques.

Les fonctions définies par l'utilisateur sont des fonctions personnalisées créées et définies par l'utilisateur. Par exemple, vous

pouvez créer une fonction personnalisée pour imprimer Hello World.

Fonctions prédéfinies

Il existe de nombreuses fonctions prédéfinies, alors commençons par les plus simples. En utilisant la fonction mean(),

obtenons la moyenne de ces trois classements de films :

• Star Wars (1977) - classement de 8,7

•

• Retour vers le futur - note de 8,5

Jumanji - note de 6,9

ratings <- c(8.7, 6.9, 8.5)

mean(ratings)

Nous pouvons utiliser la fonction sort() pour trier la classification des films par ordre croissant.

sort(ratings)

Vous pouvez également trier par ordre décroissant, en ajoutant dans l'argument decreasing = TRUE.

sort(ratings, decreasing = TRUE)

Fonctions définies par l'utilisateur

Les fonctions sont très faciles à créer en R :

printHelloWorld <- function(){

print("Hello World")

}

Pour l'utiliser, il suffit de lancer la fonction avec () à la fin :

printHelloWorld ()

Mais que faire si vous voulez que la fonction fournisse un certain résultat basé sur certaines entrées ?

add <- function(x, y) {

x + y

}

add(3, 4)

Comme vous pouvez le voir ci-dessus, vous pouvez créer des fonctions avec la syntaxe suivante pour prendre des entrées

Publicité

(comme ses arguments), puis fournir des sorties.

f <- function(<arguments>) {

Faire quelque chose

Faire quelque chose

return(une_valeur_de_sortie)

}

Renvoi explicite des résultats dans des fonctions définies par l'utilisateur

Dans R, la dernière ligne de la fonction est automatiquement déduite comme la sortie de la fonction. Vous pouvez également

demander explicitement à la fonction de renvoyer une sortie.

add <- function(x, y){

return(x + y)

}

add(3, 4)

Il est bon d'utiliser la fonction return() pour indiquer explicitement à la fonction de renvoyer le résultat.

Utilisation des déclarations IF/ELSE dans les fonctions

La fonction return() est particulièrement utile si vous avez des instructions IF dans la fonction, lorsque vous voulez que votre

sortie dépende d'une condition quelconque :

isGoodRating <- function(rating){

#This function returns "NO" if the input value is less than 7. Otherwise it

returns "YES".

if(rating < 7){

return("NO") # return NO if the movie rating is less than 7

}else{

return("YES") # otherwise return YES

}

}

isGoodRating(6)

isGoodRating(9.5)

Définition de valeurs d'arguments par défaut dans vos fonctions personnalisées

Vous pouvez définir une valeur par défaut pour les arguments dans votre fonction. Par exemple, dans la fonction

isGoodRating(), que se passerait-il si nous voulions créer un seuil pour ce que nous considérons comme une bonne

notation ? Peut-être devrions-nous, par défaut, fixer le seuil à 7 :

isGoodRating <- function(rating, threshold = 7){

if(rating < threshold){

return("NO") # return NO if the movie rating is less than the threshold

}else{

return("YES") # otherwise return YES

}

}

isGoodRating(6)

isGoodRating(10)

Remarquez que nous n'avons pas eu à spécifier explicitement le deuxième argument (seuil), mais que nous avons pu le

préciser. Supposons que nous ayons une norme plus élevée pour la classification des films, alors portons notre seuil à 8,5 :

isGoodRating(8, threshold = 8.5)

Publicité

Vous savez maintenant comment créer des valeurs par défaut. Notez que si vous connaissez l'ordre des arguments, vous n'avez

pas besoin d'écrire l'argument, comme dans :

isGoodRating(8, 8.5) #rating = 8, threshold = 8.5

Utiliser des fonctions dans des fonctions

L'utilisation de fonctions au sein de fonctions n'est pas un problème. En fait, vous avez déjà utilisé les fonctions print() et

return(). Essayons donc de rendre notre isGoodRating() plus intéressante. Créons une fonction qui puisse nous aider à

décider quel film regarder, en fonction de son classement. Nous devrions pouvoir fournir le nom du film, et elle devrait

retourner NON si la note du film est inférieure à 7, et OUI sinon. Tout d'abord, lisons dans nos données sur les films :

my_data <- read.csv("movies-db.csv")

head(my_data)

Ensuite, vous souvenez-vous comment vérifier la valeur de la colonne average_rating si nous spécifions un nom de film ?

Voici comment faire :

Within myData, the row should be where the first column equals "Akira"

AND the column should be "average_rating"

akira <- my_data[my_data$name == "Akira", "average_rating"]

akira

isGoodRating(akira)

Maintenant, rassemblons tout cela en une fonction, qui peut prendre n'importe quel nom de film et renvoyer un OUI ou un

NON pour savoir si nous devons le regarder ou non.

watchMovie <- function(data, moviename){

rating <- data[data["name"] == moviename,"average_rating"]

return(isGoodRating(rating))

}

watchMovie(my_data, "Akira")

Assurez-vous de prendre le temps de comprendre la fonction ci-dessus. Remarquez que la fonction attend deux entrées : data

et moviename, et donc lorsque nous utilisons la fonction, nous devons également entrer deux arguments. Mais que faire si

nous voulons seulement regarder de très bons films ? Comment fixer le seuil de classification que nous avons créé plus tôt ?

Voici comment :

watchMovie <- function(data, moviename, my_threshold){

rating <- data[data$name == moviename,"average_rating"]

return(isGoodRating(rating, threshold = my_threshold))

}

Maintenant, notre WatchMovie prend trois entrées : data, moviename et my_threshold.

watchMovie(my_data, "Akira", 7)

Que faire si nous voulons continuer à fixer notre seuil par défaut à 7 ? Voici comment nous pouvons le faire :

watchMovie <- function(data, moviename, my_threshold = 7){

rating <- data[data[,1] == moviename,"average_rating"]

return(isGoodRating(rating, threshold = my_threshold))

}

watchMovie(my_data,"Akira")

Comme vous pouvez l'imaginer, si nous affectons la sortie à une variable, la variable sera évaluée à OUI

a <- watchMovie(my_data, "Akira")

a

Bien que le WatchMovie soit plus facile à utiliser, je ne peux pas dire quelle est la cote réelle du film. Comment puis-je faire

Publicité

en sorte qu'il affiche la classification réelle du film avant de me donner une réponse ? Pour ce faire, il suffit d'ajouter une

déclaration d'impression avant la dernière ligne de la fonction.

Nous pouvons également utiliser la fonction intégrée paste() pour concaténer une séquence de chaînes de caractères en une

seule chaîne.

watchMovie <- function(moviename, my_threshold = 7){

rating <- my_data[my_data[,1] == moviename,"average_rating"]

memo <- paste("The movie rating for", moviename, "is", rating)

print(memo)

return(isGoodRating(rating, threshold = my_threshold))

}

watchMovie("Akira")

Notez simplement que la sortie retournée est en fait la valeur résultante de la fonction :

x <- watchMovie("Akira")

print(x)

Variables globales et locales

Jusqu'à présent, nous avons créé des variables à l'intérieur des fonctions, mais avez-vous remarqué ce qui arrive à ces variables

en dehors de la fonction ? Essayons de voir ce que memo renvoie :

watchMovie <- function(moviename, my_threshold = 7){

rating <- my_data[my_data[,1] == moviename,"average_rating"]

memo <- paste("The movie rating for", moviename, "is", rating)

print(memo)

isGoodRating(rating, threshold = my_threshold)

}

watchMovie("Akira")

memo

Nous avons une erreur : l'objet "mémo" n'a pas été trouvé. Pourquoi ? C'est parce que toutes les variables que nous créons dans

la fonction restent dans la fonction. En termes techniques, il s'agit d'une variable locale, ce qui signifie que l'affectation de la

variable ne persiste pas en dehors de la fonction. La variable memo n'existe qu'à l'intérieur de la fonction.

Mais il existe un moyen de créer des variables globales à l'intérieur d'une fonction - où vous pouvez utiliser la variable globale

en dehors de la fonction. Il n'est généralement pas recommandé d'utiliser des variables globales, car il peut devenir plus

difficile de gérer votre code, c'est donc juste pour votre information. Pour créer une variable globale, nous devons utiliser cette

syntaxe :

x <<- 1

Voici un exemple d'affectation de variable globale :

myFunction <- function(){

y <<- 3.14

return("Hello World")

}

myFunction()

y #created only in the myFunction function