簡體   English   中英

R使用ifelse和eval組合的行為

[英]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標記它的輸出invisiblerepifelse沒有,實際上有效地剝離了它們輸入的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM