Ecrire vos propres fonctions R

R permet à l'utilisateur d'écrire ses propres fonctions.

Une fonction est définie de la forme suivante :

Code R :
name <- function(arg_1, arg_2, ...) expression


expression est une expression R, (habituellement une expression regroupée), qui utilise les arguments, arg_i, pour calculer une valeur. La valeur de l'expression est la valeur retournée par la fonction.

Pour exécuter la fonction faire : name(arg_1, arg_2,...)

Un exemple simple

Écrivons une fonction permettant de calculer le coefficient de variation (CV) d'une série de valeur.

Le CV est définit comme étant le rapport de l'écart type sur la moyenne des valeurs.

La fonction est définie comme suit :

Code R :
 
#x est un vecteur contenant une série de valeurs
cv<-function(x){
moy<-mean(x) # moyenne de x
s<-sd(x)# ecart type de x
rslt<-s/moy # calcul du CV
rslt #la fonction retourne le résultat
}
 




<h2 class="formatter-title wiki-paragraph-2" id="paragraph-definir-de-nouveaux-operateurs-binaires">Définir de nouveaux opérateurs binaires</h2>

Le nouvel opérateur s'écrit : %anything%.

Supposons, par exemple, nous choisissons ! comme caractère interne. La définition de la fonction serait comme suit:

Code R :
"%!%" <- function(X, y) { ... }


(Notez l'utilisation de guillemets.) La fonction pourrait alors être utilisé comme X %!% y .


<h2 class="formatter-title wiki-paragraph-2" id="paragraph-les-arguments-de-la-fonction-et-les-valeurs-par-defaut">Les arguments de la fonction et les valeurs par défaut</h2>


Si les arguments des fonctions appelées sont donnés de la forme "name = object ", ils peuvent être dans n'importe quel ordre. Dans le cas contraire, il faut respecter l'ordre des arguments.

Ainsi, si il y a une fonction fun1 définie par :

Code R :
 
fun1 <- function(data, data.frame, graph, limit) {
         [function body omitted]
       }


Alors la fonction peut être invoquée de plusieurs manières, par exemple:

Code R :
 
ans <- fun1(d, df, TRUE, 20)
ans <- fun1(d, df, graph=TRUE, limit=20)
 ans <- fun1(data=d, limit=20, graph=TRUE, data.frame=df)
 


Ces commandes sont toutes équivalentes.

Dans de nombreux cas les arguments peuvent être des valeurs par défaut couramment appropriées, auquel cas ils peuvent être omis lors de l'appel lorsque les valeurs par défaut sont appropriées. Par exemple, si fun1 ont été définis comme :

Code R :
 
fun1 <- function(data, data.frame, graph=TRUE, limit=20) { ... }
 


il pourrait être appelé comme :

Code R :
ans <- fun1(d, df)



qui est maintenant équivalente aux trois cas ci-dessus, ou en tant que :

Code R :
ans <- fun1(d, df, limit=10)


qui modifie l'un des paramètres par défaut.

Il est important de noter que les arguments avec valeurs par défaut peuvent être des expressions arbitraires, même impliquant d'autres arguments de la même fonction. Ils ne sont pas limités à être des constantes, comme dans notre exemple simple ici.

<h2 class="formatter-title wiki-paragraph-2" id="paragraph-l-argument">L'argument '...'</h2>

L'argument '...' permet de passer un ensemble de paramètres d'une fonction à un autre. Par exemple de nombreuses fonctions graphiques utilise la fonction par() et les fonctions comme plot() permettent à l'utilisateur de passer des paramètres graphiques à par() pour contrôler la sortie graphique.

Cela peut être fait en incluant un argument supplémentaire, littéralement «...», à la fonction, qui peut ensuite être transmis. Un exemple est donné ci-dessous :

Code TEXT :
fun1 <- function(data, data.frame, graph=TRUE, limit=20, ...) {
       [omitted statements]
       if (graph)
         par(pch="*", ...)
       [more omissions]
     }



<h2 class="formatter-title wiki-paragraph-2" id="paragraph-les-affectations-au-sein-des-fonctions">Les affectations au sein des fonctions</h2>

Notez que toutes les affectations ordinaires effectuées au sein d'une fonction sont locales et temporaires et sont perdues après la sortie de la fonction.

Pour faire une affectation globale au sein d'une fonction, il faut utiliser l'opérateur de "superaffectation" <<- ou la fonction assign()


Enjoyed this article? I’d be very grateful if you’d help it spread by emailing it to a friend, or sharing it on Twitter, Facebook or Linked In.

Show me some love with the like buttons below... Thank you and please don't forget to share and comment below!!
Avez vous aimé cet article? Je vous serais très reconnaissant si vous aidiez à sa diffusion en l'envoyant par courriel à un ami ou en le partageant sur Twitter, Facebook ou Linked In.

Montrez-moi un peu d'amour avec les like ci-dessous ... Merci et n'oubliez pas, s'il vous plaît, de partager et de commenter ci-dessous!





Cette page a été vue 46207 fois