Disclaimer: Dieser Code ist eine schlechte Praxis., und funktioniert nur wegen etwas Bug-like. Niemals in einer realen Situation verwenden. Diese Frage betrifft das interessante Verhalten von R, nichts anderes als das.Rs Verhalten mit ifelse und eval in Kombination
Nach dem Lesen this question wurde ich ziemlich verwirrt. Offensichtlich kann ifelse auf Informationen zugreifen, die versteckt werden sollten.
Sagen wir:
> x <- expression(dd <- 1:3)
> y <- expression(dd <- 4:6)
> z <- c(1,0)
> eval(x)
> eval(y)
>
Wir keine Ausgabe erhalten. Logik, da beide Ausdrücke tatsächlich Zuordnungen eines Vektors dd sind. eval() soll dann nicht ausgeben. Aber komischerweise, wenn Sie versuchen, die lustige Code
Sie erhalten Ausgabe ??? Jemand hat eine Erklärung dafür?
Es ist nicht so einfach wie "R wertet und dann verwendet dd". Egal welche Reihenfolge du z gibst, egal welche Bedingung du benutzt, dd ist immer die zuletzt erwähnte eval()
.
> 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:
einen genaueren Blick auf den Quellcode ifelse zeigt, dass die Linie darauf achten, dies geschieht, ist die rep()
:
> x <- expression(dd <- 1:3)
> eval(x)
> rep(eval(x),2)
[1] 1 2 3 1 2 3
Dennoch ist es doesn‘ t lösen die Frage ...
* PROBABLY * Eval gibt unsichtbares Objekt zurück. – kohske
@koshke: scheint so. str (eval (x)) gibt das Objekt an. Setzen Sie es als Antwort und ich werde akzeptieren. –