2009-08-26 173 views
76

我發現R的ifelse語句非常方便。例如:爲什麼R的ifelse語句不能返回向量?

ifelse(TRUE,1,2) 
# [1] 1 
ifelse(FALSE,1,2) 
# [1] 2 

但是我對以下行爲有些困惑。

ifelse(TRUE,c(1,2),c(3,4)) 
# [1] 1 
ifelse(FALSE,c(1,2),c(3,4)) 
# [1] 3 

這是一個設計選擇是否高於我的薪酬等級?

+1

有點奇怪設計ifelse鑑於簡單,如果其他人的作品。 – 2sb 2012-06-29 03:55:00

+3

ifelse是一個矢量化函數。他們應該用於不同的任務。 – marbel 2014-01-11 05:07:19

回答

60

爲ifelse文檔狀態:

ifelse返回與相同 形狀test填充有從任yesno取決於元件是否testTRUE選擇 元素的值或FALSE

既然你逝去的長度爲1的測試值,你得到長度爲1的結果,如果通過較長的測試向量,你會得到更長的結果:

> ifelse(c(TRUE, FALSE), c(1, 2), c(3, 4)) 
[1] 1 4 
+10

也許你真正想要的第二組陳述是'if(TRUE)c(1,2)else c(3,4)'。 – 2009-08-26 16:33:13

7

是的,我想ifelse( )是專爲當你有一個很長的測試向量,並希望將每個映射到兩個選項之一而設計的。例如,我經常做的陰謀色彩()以這樣的方式

plot(x,y, col = ifelse(x>2, 'red', 'blue')) 

如果你有一個測試的大長向量,但希望對爲輸出,你可以使用sapply()plyrllply()什麼的,也許。

47

我敢打賭,你想要一個簡單的if聲明,而不是ifelse - 在R,if不僅僅是一個控制流結構,它可以返回一個值:

> if(TRUE) c(1,2) else c(3,4) 
[1] 1 2 
> if(FALSE) c(1,2) else c(3,4) 
[1] 3 4 
+0

你先生是一個救命的人,謝謝 – fuadj 2017-12-01 19:41:09

+0

@Ken,這對我有用,即使我得到我需要的一個常量警告'「警告if(req(inputval)==」All「){: 條件長度> 1,只有第一個元素將被使用「'我應該怎麼做才能擺脫這個警告? – user5249203 2018-01-05 21:23:07

-1

有時候,用戶只需要一個switch聲明而不是ifelse。在這種情況下:

condition <- TRUE 
switch(2-condition, c(1, 2), c(3, 4)) 
#### [1] 1 2 

(這是肯·威廉姆斯的回答另一種語法選項)