2010-10-01 20 views
14

Cette question provient d'une gamme d'autres questions qui traitent essentiellement du même problème. Pour une raison étrange, l'utilisation d'une fonction dans une autre fonction échoue parfois dans le sens où les variables définies dans l'environnement local de la première fonction ne sont pas retrouvées dans la seconde fonction.Portée et fonctions dans R 2.11.1: Qu'est-ce qui ne va pas?

Le schéma classique en pseudo-code:

ff <- function(x){ 
    y <- some_value 
    some_function(y) 
} 
ff(x) 

Erreur dans eval (expr, Envir, Enclos): objet 'y' non trouvé

D'abord, je pensais qu'il avait quelque chose à voir avec les méthodes S4 et la portée, mais cela arrive aussi avec d'autres fonctions. J'ai eu une interaction avec l'équipe de développement de R, mais tout ce qu'ils ont fait, c'est de me diriger vers le site de rapport de bogue (ce qui n'est pas le plus invitant, je dois dire). Je n'ai jamais eu de commentaires. Comme le problème ne cesse de se poser, je me demande s'il y a une explication logique à cela. Est-ce une erreur commune dans tous ces cas, et si oui, laquelle? Ou est-ce vraiment un bug?

Certaines de ces questions:

PS: Je sais que le R-devel liste, au cas où vous vous demanderiez ...

+0

J'aime votre solution de contournement sur celui-ci http://stackoverflow.com/questions/3742415/r-statistical-scoping-error-using-transformby-part-of-the-doby-package –

+0

J'ai également contacté R-devel , et on m'a dit à peu près la même chose que @Richie, @Jonathan, et @hadley m'a dit. Merci à tous pour les précieuses réponses. –

Répondre

3

Comme Dirk l'a mentionné dans sa réponse, il n'y a pas réellement de problème avec le code que vous avez posté. Dans les liens que vous avez publiés dans la question, il semble y avoir un thème commun: some_function contient du code qui dérange avec les environnements d'une certaine manière.Cette Messing est explicite, en utilisant new.env et with ou implicitement, en utilisant un argument data, qui a probablement une ligne comme

y <- eval(substitute(y), data) 

La morale de l'histoire est double. Tout d'abord, essayez d'éviter de manipuler explicitement les environnements, sauf si vous êtes vraiment sûr de savoir ce que vous faites. Et deuxièmement, si une fonction a un argument de données, placez toutes les variables dont vous avez besoin dans cette trame de données.

+0

En répondant à Dirk, je sais qu'il n'y a pas de problème avec ce code. C'était juste une illustration. Merci pour la réponse, cela résume assez bien je suppose. Et merci pour le conseil, cela m'évitera certainement beaucoup de frustration. Accepté. –

4

Il ya sans aucun doute des bogues dans R, mais beaucoup de problèmes que les gens ont eu sont souvent des erreurs dans l'implémentation de some_function, pas de R lui-même. R a des règles de portée (voir http://cran.r-project.org/doc/manuals/R-intro.html#Scope) qui, lorsqu'elles sont combinées avec l'évaluation paresseuse des arguments de la fonction et la capacité à eval arguments dans d'autres portées sont extrêmement puissantes mais entraînent souvent des erreurs subtiles.

0

Eh bien il n'y a pas de problème dans ce que vous avez publié:

/tmp$ cat joris.r 
#!/usr/bin/r -t 

some_function <- function(y) y^2 

ff <- function(x){ 
    y <- 4 
    some_function(y) # so we expect 16 
} 
print(ff(3))   # 3 is ignored 
$ ./joris.r 
[1] 16 
/tmp$ 

Pourriez-vous retraiter et Postan bug réel ou disfonctionnement?

+0

Il a fourni des liens vers 5 exemples. –

+0

Cool, quelle est la prochaine. Référence à * allez-y et regardez-vous sur les intertubes vous-même *? Désolé, aide concrète pour des questions concrètes et tangibles. Joris est un cookie très intelligent, et je serais heureux d'essayer d'aider avec des questions explicites. –

+1

Ma question concerne le lien entre les cinq bogues. Je ne pouvais pas vraiment copier-coller toute la discussion qui s'y tenait, n'est-ce pas? –

5

R a une portée lexicale et dynamique. La portée lexicale fonctionne automatiquement, mais la portée dynamique doit être implémentée manuellement et nécessite une bonne tenue des livres. Seules les fonctions utilisées de manière interactive pour l'analyse des données ont besoin d'une portée dynamique, de sorte que la plupart des auteurs (comme moi!) N'apprennent pas à le faire correctement. Voir aussi: standard non-standard evaluation rules