Académique Documents
Professionnel Documents
Culture Documents
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.
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.
nom.fonction<-function(arg1,arg2,arg3, ...
...
instructions
...
ex<-fonction(x,y,z,t)
produit<-x*y
division<-z/t
return(produit + division)
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
ur cet exemple, l’intérêt n’est pas flagrant mais cela peut être quelquefois très utile.
2.2 - L’expression for
<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)
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)
’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
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.
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)
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).
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 :
CORRECTION :
univarie<-function(table,var,facteur="region")
if (!is.factor(table[,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
for (i in 1 :nmod)
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]
resultat[i,2]<-median(var.reg)
resultat[i,3]<-mean(var.reg)
resultat[i,4]<-sd(var.reg)
# Réalisation du graphique
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.
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 :
CORRECTION :
bivarie<-function(table,var1,var2,facteur="region")
mod<-levels(table[,facteur])
nmod<-length(mod)
tablek<-subset(table,table[,facteur]==mod[i])
cc<-cor(tablek[,var1],tablek[,var2])
if (i !=1) windows()
plot(tablek[,var2],tablek[,var1],ylab=var1,xlab=var2,main=titre)