题
我发现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
这是一个设计选择我paygrade?
解决方案
该文件 ifelse
国家:
ifelse
返回的价值有相同的 形状test
这是充满了 元素从选择yes
或no
这取决于是否元 的test
是TRUE
或FALSE
.
因为你通过测试数值的长度为1,你得到的结果的长1.如果你通过长测试载体,你会得到更长的结果:
> ifelse(c(TRUE, FALSE), c(1, 2), c(3, 4))
[1] 1 4
所以 ifelse
目的是为特定的目的是测试一矢量的布尔和返回的一个矢量的一样长,充满了取的元素(矢量) yes
和 no
参数。
它是一种常见的混淆,因为功能的姓名,使用这个当你真的想只是一个正常的 if () {} else {}
建设而不是。
其他提示
我打赌你想要一个简单的 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
注意,你可以规避的问题,如果你将结果内部 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
是的,我认为ifelse()是真的设计的时候你有一个很大的长矢量测试,并希望对地图的每一个到两个选项之一。例如,我经常做的颜色情节()这种方式:
plot(x,y, col = ifelse(x>2, 'red', 'blue'))
如果你有一个很大的长矢量测试但希望对用于输出,可以使用 sapply()
或 plyr
's llply()
或者什么东西,也许。
这是一种方法相似,建议通过Cath,但它可以与现有的预先分配的载体
这是根据周围使用 get()
像这样:
a <- c(1,2)
b <- c(3,4)
get(ifelse(TRUE, "a", "b"))
# [1] 1 2
有时的用户只需要一个 switch
声明而不是一个 ifelse
.在这种情况下:
condition <- TRUE
switch(2-condition, c(1, 2), c(3, 4))
#### [1] 1 2
(这是另一个法选择肯*威廉姆斯的回答)
使用"如果",例如
> `if`(T,1:3,2:4)
[1] 1 2 3
在你的情况下,使用 if_else
从 dplyr
就已经有所帮助: if_else
更严格比 ifelse
, 和抛出一个错误对于你的情况:
library(dplyr)
if_else(TRUE,c(1,2),c(3,4))
#> `true` must be length 1 (length of `condition`), not 2