Vous êtes sur la page 1sur 7

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")

# 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)

for (i in 1:nmod) # Pour chaque modalité

# Extraction d’un sous ensemble

tablek<-subset(table,table[,facteur]==mod[i])

cc<-cor(tablek[,var1],tablek[,var2])

print(paste("Le coefficient de corrélation des variables",var1,"et",var2,"dans la


région",mod[i],"est :",round(cc,3)))

if (i !=1) windows()

titre<-paste("Nuage de point des variables",var1,"et",var2,"dans la région",mod[i])

plot(tablek[,var2],tablek[,var1],ylab=var1,xlab=var2,main=titre)

Vous aimerez peut-être aussi