studio - Alcance y funciones en R 2.11.1: ¿Qué está mal?
notacion cientifica en r (4)
Bueno, no hay problema en lo que publicaste:
/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ías replantear y publicar errores reales o errores?
Esta pregunta proviene de una serie de otras preguntas que todas tratan esencialmente con 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.
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): objeto ''y'' no encontrado
Primero 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.
A medida que 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 esas preguntas:
- Uso de funciones y entornos
- Error de alcance R (estadístico) usando transformBy (), parte del paquete doBy.
- ¿Cómo usar acast (reshape2) dentro de una función en R?
- ¿Por qué no puedo pasar un conjunto de datos a una función?
- Los valores no se copian al siguiente entorno local
PD: Sé la lista R-devel, en caso de que se pregunte ...
R tiene un 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 cómo hacerlo correctamente.
Ver también: las reglas estándar de evaluación no estándar .
Sin duda, hay errores en R, pero muchos de los problemas que las personas han tenido son a menudo errores 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 los argumentos de las funciones y la capacidad de evaluar los argumentos en otros ámbitos son extremadamente poderoso, pero que a menudo conducen a errores sutiles.
Como dijo Dirk en su respuesta, en realidad no hay un problema con el código que publicaste. En los enlaces que publicó en la pregunta, parece que hay un tema en común: some_function
contiene un código que molesta con los entornos de alguna manera. Este desorden es explícito, usando new.env
y with
o implícitamente, usando un argumento de 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.