descargo de responsabilidad: este código es una mala práctica., y solo funciona debido a algo parecido a un error. Nunca lo use en una situación real. Esta pregunta es sobre el comportamiento interesante de R, nada más que eso.Comportamiento de R con ifelse y eval en combinación
Después de leer this question Me quedé bastante perplejo. Aparentemente, ifelse puede acceder a información que debe estar oculta.
decimos que:
> x <- expression(dd <- 1:3)
> y <- expression(dd <- 4:6)
> z <- c(1,0)
> eval(x)
> eval(y)
>
Obtenemos sin salida. Lógica, ya que ambas expresiones son realmente asignaciones de un vector dd. eval() no debe dar salida entonces. Pero, por extraño que parezca, cuando intenta el código divertido
> ifelse(z==0,eval(x),eval(y))
[1] 4 2
¿Obtiene salida ??? Alguien tiene una explicación para esto?
No es tan simple como "R evalúa y luego usa dd". Sea cual sea el orden que le dé a z, cualquiera que sea la condición que use, dd es siempre el último eval()
mencionado.
> ifelse(z==0,eval(x),eval(y))
> dd
[1] 4 5 6
> ifelse(z==1,eval(x),eval(y))
> dd
[1] 4 5 6
> z <- c(0,1)
> ifelse(z==0,eval(x),eval(y))
> dd
[1] 4 5 6
> ifelse(z==1,eval(x),eval(y))
> dd
[1] 4 5 6
> ifelse(z==1,eval(y),eval(x))
> dd
[1] 1 2 3
EDIT:
un vistazo más de cerca el código fuente de ifelse muestra que la línea de hacer que esto suceda, es el rep()
:
> x <- expression(dd <- 1:3)
> eval(x)
> rep(eval(x),2)
[1] 1 2 3 1 2 3
embargo, que doesn' t resolver la pregunta ...
* PROBABLEMENTE * eval devuelve el objeto invisible. – kohske
@koshke: parece que sí. str (eval (x)) da el objeto. Ponlo como una respuesta y lo aceptaré. –