为什么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 

这是一个deviseselect是否在我的薪酬级别之上?

ifelse的文档说明:

ifelse返回一个具有相同形状的值,这个值是用从yesnoselect的元素填充的,这取决于test的元素是TRUE还是FALSE

由于您传递的是长度为1的testing值,因此您将获得长度为1的结果。如果您传递的testing向量较长,则会得到较长的结果:

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

我打赌你想要一个简单的if语句而不是ifelse – 在R中, if不仅仅是一个控制stream结构,它可以返回一个值:

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

是的,我认为ifelse()是真正的devise,当你有一个很长的testing向量,并希望映射到两个选项之一。 例如,我经常以这种方式为plot()做颜色:

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

如果你有一个很长的testing向量,但想要输出对,你可以使用sapply()或者plyrllply()等等。

有时用户只需要一个switch语句而不是一个ifelse 。 在这种情况下:

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

(这是Ken Williams答案的另一个语法选项)