Il vous suffit de faire un changement pour rendre votre travail par exemple - redéfinir votre fonction à utiliser substitute()
pour « fixer » les valeurs souhaitées dans le cadre de f()
:
f <- function(env,z) {
eval(substitute(x+z,list(z=z)), env)
}
Cela peut rapidement se trouble d'autant plus que vous pouvez même inclure des instructions d'affectation dans substitute()
(par exemple, remplacer x+z
avec y <- x+z
, pas que cela est tout à fait pertinent ici), mais ce choix peut être fait par le développeur ...
De plus, vous pouvez remplacer list(z=z)
dans l'expression de substitution ci-dessus avec environment()
(par exemple, substitute(x+z,environment())
) aussi longtemps que vous n » • Vous avez des noms de variables contradictoires entre ceux passés à f()
et ceux résidant dans votre «env», mais vous ne voulez peut-être pas aller trop loin.
Editer: Voici deux autres moyens, dont le premier est uniquement destiné à montrer la flexibilité dans la manipulation des environnements et le second est plus raisonnable à utiliser réellement.
1) modifier l'environnement d'enceinte de « env » (mais changer de nouveau à la valeur initiale avant la fonction sortant):
f <- function(env,z) {
e <- environment(env)
environment(env) <- environment()
output <- with(env,x+z)
environment(env) <- e
output
}
2) l'évaluation de la Force de « z » dans l'environnement actuel de la fonction (en utilisant environment()
) plutôt que de le laisser rester une variable libre après évaluation de l'expression, x+z
, dans 'env'.
f <- function(env,z) {
with(environment(),with(env,x+z))
}
En fonction de votre commande de résolution souhaitée, en cas d'associations valeur de symbole en conflit - par exemple, si vous avez « x » défini à la fois l'environnement de la fonction et de l'environnement que vous avez créé, « y » (dont la valeur de 'x' voulez-vous supposer?) - vous pouvez définir le corps de la fonction à with(env,with(environment(),x+z))
.
Y at-il une raison d'utiliser 'with'? Sinon, vous pouvez utiliser 'env $ x + z'. – Marek
Dans ma fonction, je référence beaucoup d'objets dans l'environnement, d'où le 'avec '. Mais c'est une bonne solution et je pourrais l'utiliser. –
Qu'essayez-vous de faire? Je soupçonne que tout ce que vous essayez d'accomplir sera mieux fait sans référence explicite aux environnements. Dans les paquets de plus de 15 que j'ai écrits et les nombreuses analyses de données que j'ai faites, je n'ai eu à utiliser explicitement les environnements qu'une poignée de fois. – hadley