# Programmer en R/Programmer une fonction

* Introduction
** Faire ses premiers pas
** Installer R
** Choisir son environnement de travail
** Installer des librairies
** Se documenter
* Manipulation et mise en forme des données
** Manipuler les nombres
** Manipuler les vecteurs
** Manipuler les chaînes de caractères
** Manipuler les facteurs
** Manipuler les dates et les heures
** Manipuler un tableau de données
** Manipuler une liste
* Importation et exportation des données
** Importer un fichier CSV
** Résoudre les problèmes d'encodage des caractères
** Importer un fichier TSV
** Importer un fichier texte à largeur fixe
** Importer des données depuis un tableur
** Import un fichier JSON
** Extraire des données d'une page web
* Visualisation de données
** Comprendre la grammaire des graphiques
** Représenter une carte
** Visualiser une carte choroplèthe
* Modélisation statistique
** Estimer un modèle de régression linéaire
** Estimer un modèle de régression circulaire
* Communication
* Programmation avancée
** Programmer une boucle
** Programmer une fonction
* Outils mathématiques
** Optimiser une fonction
** Manipuler les matrices
** Les fonctions statistiques de base
** Les loi de probabilités, ajustement et test
* Introduction
** Faire ses premiers pas
** Installer R
** Choisir son environnement de travail
** Installer des librairies
** Se documenter
* Manipulation et mise en forme des données
** Manipuler les nombres
** Manipuler les vecteurs
** Manipuler les chaînes de caractères
** Manipuler les facteurs
** Manipuler les dates et les heures
** Manipuler un tableau de données
** Manipuler une liste
* Importation et exportation des données
** Importer un fichier CSV
** Résoudre les problèmes d'encodage des caractères
** Importer un fichier TSV
** Importer un fichier texte à largeur fixe
** Importer des données depuis un tableur
** Import un fichier JSON
** Extraire des données d'une page web
* Visualisation de données
** Comprendre la grammaire des graphiques
** Représenter une carte
** Visualiser une carte choroplèthe
* Modélisation statistique
** Estimer un modèle de régression linéaire
** Estimer un modèle de régression circulaire
* Communication
* Programmation avancée
** Programmer une boucle
** Programmer une fonction
* Outils mathématiques
** Optimiser une fonction
** Manipuler les matrices
** Les fonctions statistiques de base
** Les loi de probabilités, ajustement et test
[ Modifier le sommaire ]

## Fonctions définies par l'utilisateur

Le logiciel R dispose de fonctions préprogrammées, appelées « primitives ». L'utilisateur a la possibilité de définir ses propres fonctions.
Une fonction est un sous-programme, c'est-à-dire une portion de code qui est exécutée lorsqu'on l'appelle.
Le logiciel R crée un environnement spécifique pour l'exécution de la fonction, c'est-à-dire qu'il travaille avec des variables locales. Ainsi, une variable définie dans une fonction peut avoir le même nom qu'une variable générale, ce sont deux variables indépendantes ; on peut modifier la valeur de cette variable, mais elle retrouve sa valeur initiale lorsque l'on sort de la fonction.

### Définition d'une fonction

Une fonction est mise dans une variable contenant un bloc d'instructions introduit par la commande function. La syntaxe générale est :
par exemple
L'évaluation de la fonction renvoie la dernière valeur calculée. On peut préciser la valeur retournée par la commande return :
par exemple

### Fonctions sur les vecteurs

Les fonctions mathématiques primitives de R s'appliquent sur des vecteurs. On s'attachera donc à créer des fonctions qui s'appliquent elles-mêmes à des vecteurs. Par exemple, la fonction suivante permet de définir une courbe en cloche dissymétrique, formée de deux demies gaussiennes de largeur différentes.
Le fait d'utiliser la matrice de booléens indice permet, au sein d'une seule fonction, de séparer les cas x < A[1] et x ≥ A[1]. On peut donc utiliser cette fonction sur un vecteur :
Si l'on n'arrive pas à faire autrement, on peut toujours faire défiler les indices avec une boucle, mais l'évaluation de la fonction est alors plus lente.

### Récursivité

Le langage S est un langage récursif. Une fonction définie dans un script R peut donc s'appeler elle-même, avec la précaution d'usage : il faut prévoir une condition d'arrêt. Comme dans tous les langages récursifs, R crée un environnement spécifique pour l'exécution de la fonction (variables locales), il « empile » les différents appels, puis les « dépile » lorsque la condition d'arrêt est atteinte.
Nous illustrons ceci par le codage récursif de la fonction factorielle.
Mais nous remarquons que cette fonction ne s'applique qu'aux scalaires, en raison de la présence du test if (n == 1) : la condition if ne s'applique que sur un scalaire booléen. On peut modifier le code pour le rendre exécutable sur les vecteurs :
Comme souvent, on crée un vecteur de booléens appelé indice. Si toutes les valeurs sont à « 1 », alors on retourne le vecteur lui-même (puisque 1! = 1) ; c'est l'arrêt de la récursion. Sinon, on extraie le sous-vecteur dont les valeurs ne sont pas « 1 », et l'on applique la récursion.
On peut le tester avec par exemple