[英]R's behaviour using ifelse and eval in combination
免責聲明:這段代碼是不好的做法。 ,只會因為類似bug的東西而起作用 。 切勿在真實情況下使用它。 這個問題是關於R的有趣行為,沒有別的。
看完這個問題后,我非常困惑。 顯然,ifelse可以訪問應該隱藏的信息。
說我們這樣做:
> x <- expression(dd <- 1:3)
> y <- expression(dd <- 4:6)
> z <- c(1,0)
> eval(x)
> eval(y)
>
我們沒有輸出。 邏輯,因為兩個表達式實際上是向量dd的賦值。 eval()不應該給出輸出。 但奇怪的是,當你嘗試有趣的代碼時
> ifelse(z==0,eval(x),eval(y))
[1] 4 2
你得到輸出??? 有人對此有解釋嗎?
它並不像“R評估然后使用dd”那么簡單。 無論你給z什么順序,無論你使用什么條件,dd總是最后提到的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
編輯:
仔細查看ifelse的源代碼,可以看出確保發生這種情況的行是rep()
:
> x <- expression(dd <- 1:3)
> eval(x)
> rep(eval(x),2)
[1] 1 2 3 1 2 3
不過,它沒有解決問題......
這不是一個錯誤
控制結果的控制台上的'輸出'是有條件的。 這可以通過函數本身來確定 - 例如:
> f=function(x)x;
> g=function(x)invisible(x);
> f(1)
[1] 1
> g(2)
> .Last.value
[1] 2
該值仍然正常返回 - 它只是沒有打印在控制台上。
這里發生的是eval
標記它的輸出invisible
但rep
和ifelse
沒有,實際上有效地剝離了它們輸入的invisible
屬性。
看來,invisible是變量的特殊屬性,不會通過rep操作傳遞。 它也沒有通過任務:
> h=function(x){y=x;y;}
> f(g(1))
> h(g(1))
[1] 1
>
看看?invisible
更多的背景。
R總是評估ifelse
命令的兩個替代方案。 您可以將其合理化為必要的,以便准備好選擇每個向量中的哪個項目返回到調用環境。 if (cond) {affirm-conseq} else {neg-conseq}
。 在查看ifelse
的代碼時,會顯示基於第三個ifelse參數的評估而設置的“dd”的基礎。 在“是” - 向量之后評估“否” - 向量代碼,以便選擇負向后向量中的哪些項被分配給“ans” - 輸出向量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.