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

Chr*_*ois 105 if-statement r r-faq

我发现R的ifelse陈述不时很方便.例如:

ifelse(TRUE,1,2)
# [1] 1
ifelse(FALSE,1,2)
# [1] 2
Run Code Online (Sandbox Code Playgroud)

但是我对以下行为感到困惑.

ifelse(TRUE,c(1,2),c(3,4))
# [1] 1
ifelse(FALSE,c(1,2),c(3,4))
# [1] 3
Run Code Online (Sandbox Code Playgroud)

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

Nat*_*hen 85

ifelse各州的文件:

ifelse返回一个具有相同形状的值,该值test填充了从中选择的元素yesno取决于元素是否testTRUEFALSE.

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

> ifelse(c(TRUE, FALSE), c(1, 2), c(3, 4))
[1] 1 4
Run Code Online (Sandbox Code Playgroud)

因此ifelse,其目的是测试布尔值向量并返回相同长度的向量,填充从(向量)yesno参数中获取的元素.

由于函数的名称,这是一个常见的混淆,当你真的只想要一个正常的if () {} else {}结构时使用它.

  • 也许你真正想要的第二组陈述是`if(TRUE)c(1,2)else c(3,4)`. (14认同)

Ken*_*ams 61

我打赌你想要一个简单的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
Run Code Online (Sandbox Code Playgroud)


Cat*_*ath 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
Run Code Online (Sandbox Code Playgroud)

  • 恕我直言,这鼓励滥用矢量化的ifelse()函数代替控制流if ... else ...进行分配。如果条件是单个“ TRUE”或“ FALSE”值,我宁愿写成“ a &lt;-if(TRUE)c(1,2)else c(3,4)”或`if(TRUE)a &lt; -c(1,2)否则a &lt;-c(3,4)` (3认同)
  • @Uwe,尽管我不认为在单个条件下使用“ifelse”而不是“if”...“else”时的性能差异确实会成为问题,并且在某些情况下“ifelse”可能是首选代码(这里简单猜测),我不能不同意你的观点;-)。我只是想用“ifelse”展示一种方法。 (2认同)

Bre*_*nor 9

是的,我认为ifelse()是真的设计用于当你有一个很长的测试向量并想要将每个选项映射到两个选项之一时.例如,我经常以这种方式为plot()做颜色:

plot(x,y, col = ifelse(x>2,  'red', 'blue'))
Run Code Online (Sandbox Code Playgroud)

如果你有一个测试的大长向量,但希望对为输出,你可以使用sapply()plyrllply()什么的,也许.


blu*_*ddd 6

使用`if`,例如

> `if`(T,1:3,2:4)
[1] 1 2 3
Run Code Online (Sandbox Code Playgroud)