为什么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
返回一个具有相同形状的值,这个值是用从yes
或no
select的元素填充的,这取决于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()
或者plyr
的llply()
等等。
有时用户只需要一个switch
语句而不是一个ifelse
。 在这种情况下:
condition <- TRUE switch(2-condition, c(1, 2), c(3, 4)) #### [1] 1 2
(这是Ken Williams答案的另一个语法选项)