Ewen Gallic
Université de Rennes 1, 2014 - 2015
name <- function(arguments) expression
name
: nom donné à la fonction (attention à respecter les contraintes de nommage) ;arguments
: les paramètres de la fonction ;expression
: le corps de la fonction.name(argument_1, argument_2)
Créons la fonction carre()
, qui retourne le carré d'un nombre.
carre <- function(x) x^2
carre(2)
## [1] 4
carre(-3)
## [1] 9
Créer une fonction qui, pour deux paramètres \(x\) et \(y\) retourne le résultat suivant : \[\frac{xy}{x^2 + y^2}.\]
Excepté pour les fonctions primitives du package base
, les fonctions sont composées de trois parties :
L'accès (et la modification) peut se faire avec les fonctions :
formals()
pour les paramètres ;body()
pour le corps ;environment()
pour l’environnement.f <- function(x) {
x^2
y <- x
y
}
f(2)
## [1] 2
return()
permet de retourner un résultat autre part qu'à la dernière ligne ;return()
en dernière ligne (inutile, et perturbant).f <- function(x) {
return(x^2)
# Un commentaire de dernière ligne
}
f(2)
## [1] 4
stat_des <- function(x) {
list(moyenne = mean(x), ecart_type = sd(x))
}
x <- runif(10)
stat_des(x)
## $moyenne
## [1] 0.4741779
##
## $ecart_type
## [1] 0.2686168
invisible()
;stat_des_2 <- function(x) {
invisible(list(moyenne = mean(x), ecart_type = sd(x)))
}
x <- runif(10)
stat_des_2(x)
str(stat_des_2(x))
## List of 2
## $ moyenne : num 0.657
## $ ecart_type: num 0.143
stat_des_2(x)$moyenne
## [1] 0.6567014
(stat_des_2(x))
## $moyenne
## [1] 0.6567014
##
## $ecart_type
## [1] 0.1433016
f <- function(x){
res <- x^2
}
f(2)
(f(2))
## [1] 4
x <- f(2)
x
## [1] 4
Exemple : soit la fonction de production \(Y(L,K, M)\), qui dépend du nombre de travailleurs \(L\) et de la quantité de capital \(K\), et du matériel \(M\), telle que \(Y(L,K, M) = L^{0.3}K^{0.5}M^{2}\). Cette fonction pourra s'écrire, en R
de la manièere suivante :
production <- function(l, k, m) l^(0.3) * k^(0.5) * m^(0.2)
Si on nous donne les valeurs \(L = 60\) et \(K = 42\) et \(M = 40\), on peut en déeduire la production :
production(60, 42, 40)
## [1] 46.28945
R
fait donc en fonction de l'ordre donné.R
cherche d'abord les paramètres nommés, puis complète en fonction de la position :production(k = 42, m = 40, l = 60)
## [1] 46.28945
production(k = 42, 60, 40)
## [1] 46.28945
=
;# On propose de définir la valeur du capital à 42 par défaut
production_2 <- function(l, m, k = 42) l^(0.3) * k^(0.5) * m^(0.2)
production_2(l = 42, m = 40)
## [1] 41.59216
production_2(l = 42, m = 40, k = 2)
## [1] 9.076152
Créer une fonction, qui étant donné un quantile \(x\), une espérance \(\mu\) et un écart-type \(\sigma\), retourne la densité de la loi normale. Comparer avec la fonction dnorm()
.
Reprendre la fonction de la question 1, et donner les valeurs par défaut 1 et 0 pour l'espérance et l'écart-type respectivement.
R
permet de ne pas saisir le nom complet des paramètres ;f <- function(premier, second, troisieme) premier + second + troisieme
f(p = 1, s = 2, t = 3)
## [1] 6
# Problème d'ambiguïté
f <- function(texte, nombre, nom) print(nom)
f("hello", 2, no = 3)
## Error: l'argument 3 correspond à plusieurs arguments formels
Attention, si le paramètre ...
figure dans la liste des paramètres de la fonction que l'on utilise, le nommage partiel ne fonctionne pas.
f <- function() sample(letters, size = 10, replace = TRUE)
...
...
sert à indiquer que la fonction peut admettre d'autres paramètres que ceux qui sont définis ;f <- function(...) names(list(...))
f(premier = 1, second = 2)
## [1] "premier" "second"
sum()
par exemple....
...
est présent !...
et aucune erreur ne sera retournée ;...
est présent.sum(3, NA, 4, na.rm = TRUE)
## [1] 7
sum(3, NA, 4, an.rm = TRUE) # Mauvaise écriture
## [1] NA
sum(3, NA, 4, na = TRUE) # Abréviation
## [1] NA
# Définition d'une variable globale
valeur <- 1
# Définition d'une variable locale à la fonction f
f <- function(x){
valeur <- 2
nouvelle_valeur <- 3
print(paste0("valeur vaut : ",valeur))
print(paste0("nouvelle_valeur vaut : ",valeur))
x + valeur
}
f(3)
## [1] "valeur vaut : 2"
## [1] "nouvelle_valeur vaut : 2"
## [1] 5
# valeur n'a pas été modifiée
valeur
## [1] 1
# nouvelle_valeur n'existe pas en dehors de f()
nouvelle_valeur
## Error: objet 'nouvelle_valeur' introuvable
R
ne trouve pas une variable dans l'environnement courant, il va chercher dans le (ou les) niveau(x) supérieur(s) ;R
essaie de la trouver dans un environnement parent.valeur <- 1
f <- function(x){
x + valeur
}
f(2)
## [1] 3
<<-
;assign()
est plus complète, puisqu'elle permet de choisir l'environnement d'affectation.rm(x)
f <- function(x){
x <<- x + 1
}
f(1)
x
## [1] 2
rm(x)
f <- function(x){
# envir = .GlobalEnv signifique que l'on veut définir dans l'environnement global
assign(x = "x", value = x + 1, envir = .GlobalEnv)
}
f(4)
x
## [1] 5