2010-12-06 13 views
7

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 ...

+1

* PROBABLY * eval görünmeyen nesneyi döndürür. – kohske

+0

@koshke: öyle görünüyor. str (eval (x)) nesneyi verir. Cevap olarak ver ve kabul edeceğim. –

cevap

5

Bu bir hata değil

Bir komutun sonucundaki konsoldaki 'çıkış' koşulludur.

> f=function(x)x; 
> g=function(x)invisible(x); 
> f(1) 
[1] 1 
> g(2) 
> .Last.value 
[1] 2 

değeri hala gayet iade ediliyor - bu sadece konsolda basılı değil: Örneğin - Bu işlevin kendisi tarafından belirlenebilir.

Burada oluyor evalinvisible ama rep ve ifelse yok onun çıkışını işaretler olduğunu ve aslında etkili bir şekilde girdi kapalı invisible özelliğini soyun.

Görünmez görünür, değişkenin özel bir özelliğidir ve rep işleminden geçirilmez. Aynı zamanda atama geçirilir değil:

> h=function(x){y=x;y;} 
> f(g(1)) 
> h(g(1)) 
[1] 1 
> 

biraz daha arka plan için ?invisible bakınız.

+0

çok doğru. Örnekler için Thx, görünüşe göre “eval()” işlevini tamamen yanlış yorumladım. –

2

R her zaman iki alternatifi ifelse komutuna göre değerlendirir. Her vektörde hangi öğenin arama ortamına döneceğini seçmek için hazır olmak için gerekli olduğu gibi mantıklı olabilirsiniz. Tersi bir if (cond) {affirm-conseq} else {neg-conseq} için geçerlidir. ifelse koduna bakıldığında, üçüncü ifelse argümanı değerlendirmesine dayalı olarak her zaman "dd" nin temeli ortaya çıkar."Hayır" -vektör kodu, negatif sonuçtaki vektörde hangi maddelerin "ans" -output vektörüne atanacağını seçmek için "evet" -vektöründen sonra değerlendirilir.

+0

aldığım kadarıyla oldu. Ben sadece bu eval() görünmez bir nesne olsa da, her zaman bir nesne döndürür özledim. –