koşullarında kullanıldığında geçerlidir: Bu kod kötü bir uygulamadır., ve yalnızca gibi bir hata nedeniyle çalışır. Asla bunu gerçek bir durumda kullanmayın. Bu soru R'nin ilginç davranışı hakkında, bundan başka bir şey değil.R'nın davranışı, ificse ve eval
this question okuduktan sonra çok şaşırdım. Görünüşe göre, ifelse gizlenmesi gereken bilgilere erişebilir.
yaptığımız Say:> x <- expression(dd <- 1:3)
> y <- expression(dd <- 4:6)
> z <- c(1,0)
> eval(x)
> eval(y)
>
Biz hiçbir çıkış olsun. Mantık, her iki ifade de aslında bir vektör dd atamalarıdır. eval() o zaman çıktı vermemeli. komik kodu
> ifelse(z==0,eval(x),eval(y))
[1] 4 2
çalıştığınızda Ama gariptir, Sen çıktıyı almak ??? Birinin bunun için bir açıklaması var mı?
"R değerlendirir ve sonra dd kullanır" kadar basit değildir. Hangi koşulları verirseniz veriniz, kullandığınız durum ne olursa olsun, dd her zaman en son belirtilen eval()
'dur.
> 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
DÜZENLEME:
ifelse kaynak koduna daha yakından bakış satır Böyle emin olduğunu gösteriyor rep()
geçerli:
> x <- expression(dd <- 1:3)
> eval(x)
> rep(eval(x),2)
[1] 1 2 3 1 2 3
Yine de, kötü kokan t sorunu çözmek ...
* PROBABLY * eval görünmeyen nesneyi döndürür. – kohske
@koshke: öyle görünüyor. str (eval (x)) nesneyi verir. Cevap olarak ver ve kabul edeceğim. –