2010-10-01 14 views
14

Esta pregunta proviene de una serie de otras preguntas que tratan esencialmente el mismo problema. Por alguna extraña razón, el uso de una función dentro de otra función a veces falla en el sentido de que las variables definidas dentro del entorno local de la primera función no se encuentran en la segunda función.Alcance y funciones en R 2.11.1: ¿Qué está mal?

El patrón clásico en pseudo-código:

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

Error en eval (expr, Envir, enclos): de objeto 'y' No se han encontrado

principio pensé que tenía algo que ver con los métodos S4 y el alcance allí, pero también sucede con otras funciones. He tenido alguna interacción con el equipo de desarrollo de R, pero lo único que hicieron fue dirigirme al sitio de informes de errores (que no es el más atractivo, tengo que decir). Nunca recibí ningún comentario.

Como el problema sigue surgiendo, me pregunto si hay una explicación lógica para ello. ¿Es un error común en todos estos casos, y si es así, cuál? ¿O es realmente un error?

Algunas de estas preguntas:

PD: Sé que el Lista R-devel, en caso de que te lo hayas preguntado ...

+0

Me gusta su solución en este http://stackoverflow.com/questions/3742415/r-statistical-scoping-error-using-transformby-part-of-the-doby-package –

+0

También contacté con R-devel , y allí me contaron lo mismo que @Richie, @Jonathan y @hadley me lo dijeron. Gracias a todos por las valiosas respuestas. –

Respuesta

3

Como mencionó Dirk en su respuesta, en realidad no hay un problema con el código que ha publicado. En los enlaces que publicó en la pregunta, parece haber un tema en común: some_function contiene un código que daña los entornos de alguna manera.Esta es Messing ya sea explícita, usando new.env y with o implícitamente, utilizando un argumento data, que probablemente tiene una línea como

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

La moraleja de la historia es doble. En primer lugar, trate de evitar manipular entornos explícitamente, a menos que esté realmente seguro de que sabe lo que está haciendo. Y, en segundo lugar, si una función tiene un argumento de datos, entonces coloque todas las variables que necesita la función para usar dentro de ese marco de datos.

+0

Cuando respondí a Dirk, sé que no hay ningún problema con ese código. Fue solo una ilustración. Gracias por la respuesta, eso lo resume muy bien, supongo. Y gracias por la propina, eso definitivamente me evitará mucha frustración. Aceptado. –

4

Sin duda hay errores en R, pero muchos de los problemas que las personas han tenido son errores con frecuencia en la implementación de some_function, no en sí. R tiene reglas de alcance (ver http://cran.r-project.org/doc/manuals/R-intro.html#Scope) que cuando se combinan con la evaluación perezosa de argumentos de funciones y la capacidad de argumentos eval en otros ámbitos son extremadamente potentes, pero que a menudo también conducen a errores sutiles.

0

Bueno hay ningún problema en lo que usted envió:

/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$ 

Podría repetir y fallo real o Postan misfeature?

+0

Proporcionó enlaces a 5 ejemplos. –

+0

Genial, ¿qué sigue? Referencia a * solo ve y búscalo tú mismo *? Lo siento, ayuda concreta para preguntas concretas y tangibles. Joris es una cookie muy inteligente, y me encantaría intentar ayudar con preguntas explícitas. –

+1

Mi pregunta es sobre el vínculo entre los cinco errores. Realmente no pude copiar y pegar toda la discusión allí, ¿o sí? –

5

R tiene alcance léxico y dinámico. El alcance léxico funciona automáticamente, pero el alcance dinámico debe implementarse manualmente y requiere una cuidadosa contabilidad. Solo las funciones utilizadas de forma interactiva para el análisis de datos necesitan un alcance dinámico, por lo que la mayoría de los autores (¡como yo!) No aprenden a hacerlo correctamente.

Vea también: standard non-standard evaluation rules.

Cuestiones relacionadas