Vous pourriez utiliser une fermeture pour obtenir des résultats similaires sans les risques associés aux risques évoqués ci-dessus. Sans savoir exactement ce que vous essayez de faire, il est difficile de présenter un exemple pertinent. Mais le code ci-dessous pourrait être intéressant...
create.functions <- function(x){
list(
function() x,
function() x+1,
function() x^2
)
}
x <- 0
f1 <- create.functions(5)
f1[[1]]()
[1] 5
f1[[2]]()
[1] 6
f1[[3]]()
[1] 25
f2 <- create.functions(3)
f2[[1]]()
[1] 3
f2[[2]]()
[1] 4
f2[[3]]()
[1] 9
x
[1] 0
Remarquez que vous pouvez créer une suite de fonctions partageant le même paramètre, x, sans qu'il y ait de conflit entre le paramètre x et la valeur de x dans l'environnement global. Si vous avez besoin d'un nouvel ensemble de fonctions où le paramètre x est défini différemment, vous pouvez simplement créer un nouvel ensemble.
On pourrait même faire en sorte que le code s'appuyant sur la suite de fonctions ne doive pas être modifié lors du changement de la valeur de votre paramètre :
f <- create.functions(5)
f[[1]]()/f[[3]]()
[1] 0.2
f <- create.functions(3)
f[[1]]()/f[[3]]()
[1] 0.3333333
Notez que la même ligne de code f[[1]]()/f[[3]]()
renvoie des résultats différents selon la façon dont le paramètre x a été défini.