Les fonctions es fonctions sont des objets différents de ceux présentés lors de
Les fonctions es fonctions sont des objets différents de ceux présentés lors de l’E-thème précédent. A l’instar des macros de SAS, ils contiennent des instructions qui seront exécutés les unes à la suite des autres sur des arguments fournis par l’utilisateur. Une fois les instructions exécutées, elles renvoient généralement un résultat qui peut prendre la forme de graphique ou de calculs. Après avoir présenter les principes des ces objets particuliers, nous vous présenterons quelques notions et quelques fonctions pour vous permettre d’en créer à votre tour. 1 - Le principe des fonctions es fonctions ont toutes les caractéristiques des objets (attributs, modes, ...). En particulier, elles ne sont pas sauvegardées à la fin d’une session. Il est donc nécessaire, lors d’une session ultérieure, de les soumettre préalablement au logiciel. Pour cela, il suffit d’enregistrer la fonction en .txt ou en .R et de soumettre ce fichier par la commande source avant de l’utiliser. a forme générale d’une fonction est : nom.fonction<-function(arg1,arg2,arg3, ... { ... instructions ... } ar exemple, la fonction ci-dessous calcule le produit de 2 nombres x et y, la division de 2 autres (z par t) et en fait la somme. Le code est : ex<-fonction(x,y,z,t) { produit<-x*y division<-z/t return(produit + division) } e résultat de sera obtenu par la commande ex(x=2,y=5,z=6,t=2). Sur cet exemple, nous pouvons voir les 4 éléments qui compose la définition d’une fonction. 2 - Quelques éléments de programmation ans le cadre de l’écriture de fonctions, les 3 syntaxes ci-dessous sont très utiles. 2.1 - L’expression if ’expression if est utilisée lorsque l’on souhaite effectuer des opérations sur des éléments ayant une caractéristique particulière. a syntaxe est : if (<condition>) { <instructions 1> } else { <instructions2> } i la condition est respectée, les instructions 1 seront exécutées. Dans le cas contraire, ce seront les instructions 2. A noter que ces dernières sont optionnelles. Si elles ne sont pas présentes rien ne sera effectué si la condition n’est pas remplie. Lorsque les instructions ne sont pas très importantes, cela peut être fait par le code suivant x<-if (condition) valeur1 else valeur2 ... plutôt que par les lignes suivantes : if (condition) x<-valeur1 else x<-valeur2 ur cet exemple, l’intérêt n’est pas flagrant mais cela peut être quelquefois très utile. 2.2 - L’expression for ’expression for permet l’exécution répétitive d’instructions. Sa syntaxe est la suivante : for (<ind> in <vecteur> ) { <instructions> } ind est la variable de boucle. Elle va prendre successivement toutes les valeurs de vecteur (qui prend généralement la forme 1 :n ). Pour chacune de ces valeurs, les instructions seront répétées. Cet outil est particulièrement utile lorsque l’on souhaite "remplir" un tableau de résultat. On peut également l’utiliser pour du calcul vectoriel ou matriciel, mais il faut savoir que lorsque les données commencent à être volumineuses, le temps de calcul peut devenir très long. Une version vectorielle de la fonction ex peut être construite à l’aide de l’expression for. ex.vect<-fonction(x,y,z,t) { # Initialisation des vecteurs produit<-rep(0,5) division<-rep(0,5) for (i in 1 :5) { produit[i]<-x[i]*y[i] division[i]<-z[i]/t[i] } return(produit + division) } es arguments x, y, z et t seront alors des vecteurs de longueur 5. 2.3 - L’expression while ’expression while sert à exécuter des instructions tant qu’une condition est vérifiée. Dans l’exemple ci dessous, elle est utilisée pour incrémenter une variable t jusqu’au premier "o" du vecteur c composé de "oui" et de "non". c<-sample(c("o","n"),20,replace=T)i<-1t<-0 while (c[i]=="n") { t<-t+1;i<-i+1 } on utilisation est donc très proche de celle de l’expression for. 3 - Quelques fonctions utiles à la programmation e paragraphe dresse une liste de fonctions prédéfinies dans R très utiles à la réalisation de fonctions. any La fonction any permet de vérifier une condition sur tout les éléments d’un vecteur. Si l’un d’entre eux vérifie cette condition, la valeur TRUE est renvoyée. x<-c(1,2,4,5,-1) any(x>=0) La fonction apply permet d’appliquer une même fonction aux lignes ou aux colonnes d’une matrice ou d’une data.frame. Les fonctions deparse et substitute, utilisées ensemble, permettent à l’intérieur d’une fonction d’obtenir le nom d’une variable ou d’un vecteur. La fonction options, placée avant le début des lignes de code, permet de fixer quelques paramètres "esthétiques" concernant les sorties écrans. La fonction print permet d’imprimer dans la console une chaîne de caractères ou le contenu d’un objet. print("Initiation au logiciel R") La fonction paste permet d’accoler deux objet l’un à côté de l’autre. Elle sera très utile couplé à la fonction print . ind<-1:10 v<-rnorm(10) print(paste("L’élément numéro",ind,"du vecteur v est :",v)) La fonction roun permet d’arrondir les nombres. La fonction sink permet de rediriger les sorties écran vers un fichier. Elle peut être très utile lorsque l’on construit des fonctions servant à faire du "reporting" et que l’on souhaite conserver les résultats dans un fichier. La fonction stop permet d’arrêter l’exécution d’un programme. Elle a pour seul argument une chaîne de caractères qui sera imprimée dans la console. Elle est très utile, couplée à l’expression if, pour effectuer des vérifications sur les caractéristiques des arguments. La fonction traceback permet de connaitre la fonction dans laquelle s’est produite l’erreur. La commande windows() permet d’ouvrir une nouvelle fenêtre graphique. Si elle n’est pas utilisée, sont effacés au fur et à mesure, ce qui n’est pas pratique. 4 - Exercice n considère ici la table crimin.txt qui décrit pour chaque département de la France métropolitaine le taux de criminalité (variable crim), la proportion de cadres supérieurs dans la population active (variable cadr) ainsi que la zone dans laquelle se situe le département (variable region à 5 modalités : NO, NE, C, SE et SO). L’exercice consiste à programmer deux fonctions réalisant respectivement l’analyse univarié d’une variable dans chaque région (fonction univarie) et l’étude de la liaison entre les 2 variables, toujours dans chaque région (fonction bivarie). 4.1 - La fonction univarie EXERCICE : ENONCE : a fonction univarie aura pour argument le nom de la table de données, le nom de la variable étudiée et le nom de la variable catégorielle. A partir de ces 3 arguments, retourner une data-frame contenant pour chaque région la moyenne,la médiane et l’écart-type de la variable. En outre, elle devra réaliser le graphique des boîtes à moustaches parrallèles. INDICATION : n algorithme pour la construction de cette fonction est : 1. Vérifier que la variable catégorielle est bien de type factor 2. Récupérer le vecteur contenant toutes les modalités de la variable catégorielle 3. Préparer la table de résultats 4. Pour chacune des modalités, récupérer le sous ensemble de la variable et calculer les grandeurs 5. Effectuer le graphique 6. Faire "sortir" les résultats Pour information, les boites à moustaches parrallèles se font avec la fonction boxplot en utilisant comme seul argument . La moyenne, la médiane et l’écart-type se calculent respectivement avec les fonctions mean, median et sd CORRECTION : ne des solutions possible est : univarie<-function(table,var,facteur="region") { # Vérification du caractère factoriel du facteur if (!is.factor(table[,facteur])) stop("Le facteur utilisé n’est pas un facteur") # Récupération de la répartition par niveau du facteur mod<-levels(table[,facteur]) nmod<-length(mod) # Préparation de la table des résultats resultat<-as.data.frame(matrix(0,nmod,4))names(resultat)<-c("region","mediane","moyenne","ecart- type")resultat[,1]<-mod # Calcul des 3 grandeurs pour chaque région for (i in 1 :nmod) { # Récupération du sous ensemble de la variable sur la région mod[i] var.reg<-0 for (j in 1 :length(table[,var])) { if (table[j,facteur]==mod[i]) var.reg<-c(var.reg,table[j,var]) } var.reg<-var.reg[-1] # Calculs et assignation de ces derniers dans la table de résultats resultat[i,2]<-median(var.reg) resultat[i,3]<-mean(var.reg) resultat[i,4]<-sd(var.reg) } # Réalisation du graphique boxplot(table[,var] table[,facteur], main=paste("Distribution de la variable",var,"selon la variable",facteur)) return(resultat) } L’éxécution de ce programme est relativement long par rapport à la tâche qui lui incombe. Cela est principalement dû à l’utilisation de la boucle for pour sélectionner les individus selon leur région. Pour cette opération l’utilisation de var.reg<-subset(table,table[,facteur]==mod[i])[,var] à la place de { if (table[j,facteur]==mod[i]) var.reg<-c(var.reg,table[j,var]) } permet de gagner sensiblement du temps. Sur cet exemple ce n’est pas flagrant, mais lorsque le volume des données est plus significatif, le gain d’efficacité est réel. L’utilisation de multiples boucles for est donc à éviter , si cela est possible. 4.2 - La fonction bivarie EXERCICE : ENONCE : a fonction bivarie aura pour argument le nom de la table de données, les noms des deux variables étudiées et le nom de la variable catégorielle (qui sera "region" par défaut). A partir de ces 4 arguments, la fonction devra créer pour chaque modalité de la variable catégorielle le nuage de points des 2 variables. Elle devra, en même temps de la création du graphe fournir dans la console le coefficient de corrélation des deux variables concernées. INDICATION : n algorithme pour la construction de cette fonction est : 1. Vérifier que la variable catégorielle est bien de type factor 2. Pour chacune des modalités, extraire les données des 2 variables, imprimer le coefficient de corrélation et tracer le graphe. Pour information, le coefficient de corrélation se calcule avec la fonction cor et le nuage de points peut être réalisé avec la fonction plot(x,y), où x et y représentent les 2 variables. CORRECTION : ne des solutions possibles est : bivarie<-function(table,var1,var2,facteur="region") { # uploads/s3/ 3fonctions-r.pdf
Documents similaires
-
25
-
0
-
0
Licence et utilisation
Gratuit pour un usage personnel Attribution requise- Détails
- Publié le Jul 27, 2022
- Catégorie Creative Arts / Ar...
- Langue French
- Taille du fichier 0.0394MB