有时候我发现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
这是一个超出我的权限范围的设计选择吗?
有时候我发现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
这是一个超出我的权限范围的设计选择吗?
ifelse
函数的文档说明如下:
如果您传递长度为1的测试值,则会得到长度为1的结果。 如果您传递更长的测试向量,则会得到更长的结果。
ifelse
返回一个与test
形状相同的值,该值填充了从yes
或no
中选择的元素,具体取决于test
的元素是TRUE
还是FALSE
。
> ifelse(c(TRUE, FALSE), c(1, 2), c(3, 4))
[1] 1 4
ifelse
函数的特定目的是测试一组布尔值并返回一个与其长度相同的向量,填充的元素来自于(向量)yes
和no
参数。
由于该函数名称的缘故,常常会产生混淆,实际上您只需要普通的if () {} else {}
语句。
if (TRUE) c(1,2) else c(3,4)
。 - Jonathan Chang我打赌你想要一个简单的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
req(inputval)
具有更多元素。要获取单个值,函数any()
或all()
可能会有用。 - Uwe请注意,如果您将结果分配在 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()
函数来代替控制流程中的 if ... else ...
进行赋值。如果条件只有一个 TRUE
或 FALSE
值,我更喜欢写成 a <- if (TRUE) c(1,2) else c(3,4)
或 if (TRUE) a <- c(1,2) else a <- c(3,4)
。 - Uweifelse
而不是if
…else
可能不会对性能产生太大的影响,并且在某些情况下(这里只是简单猜测)可能更喜欢使用ifelse
,但我不得不同意你的看法。我只是想展示一种使用ifelse
的方式。 - Cathifelse
和 list
- ifelse(TRUE, list(c(1,2)), list(c(3,4)) )[[1]]
- thelatemail使用 `if`,例如:
> `if`(T,1:3,2:4)
[1] 1 2 3
是的,我认为ifelse()函数主要用于当你有一个长向量的测试,并想将每个测试映射到两个选项中之一。例如,我通常使用以下方式为plot()函数设置颜色:
plot(x,y, col = ifelse(x>2, 'red', 'blue'))
sapply()
或plyr
的llply()
等函数。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
dplyr
中的if_else
会很有帮助:if_else
比ifelse
更严格,并且会为您的情况抛出错误:“最初的回答”。library(dplyr)
if_else(TRUE,c(1,2),c(3,4))
#> `true` must be length 1 (length of `condition`), not 2