为什么R的ifelse语句不能返回向量?

时间:2009-08-26 16:06:33

标签: r if-statement r-faq

我发现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

这是一个超出我的薪资水平的设计选择吗?

9 个答案:

答案 0 :(得分:79)

ifelse州的文档:

  

ifelse返回一个相同的值   形状为test,充满了   从yes或。{   no取决于元素   test的{​​{1}}或TRUE

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

FALSE

所以> ifelse(c(TRUE, FALSE), c(1, 2), c(3, 4)) [1] 1 4 用于测试布尔矢量并返回相同长度的矢量的特定目的,其中填充了从(矢量)ifelseyes获取的元素参数。

由于函数的名称,这是一个常见的混淆,当你真正想要一个普通的no构造时,使用它。

答案 1 :(得分:60)

我打赌你想要一个简单的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

答案 2 :(得分:11)

请注意,如果您在ifelse

中分配结果,则可以避免此问题
ifelse(TRUE, a <- c(1,2), a <- c(3,4))
a
# [1] 1 2

ifelse(FALSE, a <- c(1,2), a <- c(3,4))
a
# [1] 3 4

答案 3 :(得分:9)

是的,我认为ifelse()实际上是为你有一个很长的测试向量而想要将每个选项映射到两个选项之一。例如,我经常以这种方式为plot()做颜色:

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

如果你有一个很长的测试向量但想要输出对,你可以使用sapply()plyr的{​​{1}}或其他东西。

答案 4 :(得分:3)

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

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

(这是Ken Williams答案的另一种语法选择)

答案 5 :(得分:3)

这是一种类似于Cath建议的方法,但是它可以与现有的预先分配的向量一起使用

它基于使用get()的方式,

a <- c(1,2)
b <- c(3,4)
get(ifelse(TRUE, "a", "b"))
# [1] 1 2

答案 6 :(得分:0)

在您的情况下,使用if_else中的dplyr会有所帮助:if_elseifelse更严格,并且会为您的情况引发错误:

library(dplyr)
if_else(TRUE,c(1,2),c(3,4))
#> `true` must be length 1 (length of `condition`), not 2

答案 7 :(得分:0)

使用`if`,例如

> `if`(T,1:3,2:4)
[1] 1 2 3

答案 8 :(得分:0)

发现于everydropr

#version 330

out vec4 frag;

void main()
{
    frag = vec4(0.0f, 0.0f, 1.0f, 1.0f);
}

可以复制条件的结果以返回所需的长度