if else function returns 不是我要求的

if else function returns not what I asked for

我有以下功能

aa<-function(x){
    if (x==c(3,4,5))
        return (1)
    if (x==c(6,7,8))
        return(2)
    else
        return(0)
}

然后我尝试以下操作:

> `aa(3)`
[1] 1
> `aa(4`)
[1] 0
> `aa(5)`
[1] 0
> `aa(6)`
[1] 2
> `aa(7)`
[1] 0
> `aa(8)`
[1] 0

我不知道为什么只有 aa(3)aa(6) 给了我想要的结果,而 aa(4)aa(5) 却没有 return 1并且 aa(7)aa(8) 不会 return 2. 如何更正我的代码,使值 3、4 或 5 returns 1 和 6 、7 或 8 returns 2,否则为 0?

对于成员资格测试,请使用 %in%,而不是 ==。看看R控制台的区别:

> 3 == c(3,4,5)
[1]  TRUE FALSE FALSE
> 3 %in% c(3,4,5)
[1] TRUE

这样就可以了

aa<-function(x){
  if (x==3|x==4|x==5){
    return (1)}
  else if (x==6|x==7|x==8){
    return(2)}
  else{
    return(0)}
}

那我有

aa(4)
[1] 1

注意 | 是 "or" 运算符

为什么? ... 你问。您应该已经看到一条您没有告诉我们的警告消息(实际上是两条)。

> aa(4)
[1] 0
Warning messages:
1: In if (x == c(3, 4, 5)) return(1) :
  the condition has length > 1 and only the first element will be used
2: In if (x == c(6, 7, 8)) return(2) else return(0) :
  the condition has length > 1 and only the first element will be used

if 语句正在处理 x == c(3, 4, 5)x == c(6, 7, 8) 操作的结果,每个操作都返回一个 3 元素逻辑向量。 if()-函数只需要一个值,如果它变得更多则发出警告,告诉您只使用了第一个项目。

有几种方法可以处理这个问题。 %in% 中缀函数是一个,您还可以使用 match()any() 将单个结果返回给 if() 函数:

 aa<-function(x){
    if (match(x, c(3,4,5)) )   # match returns a location; any value > 0 will be TRUE
        return (1)
    if (match(x, c(6,7,8)) )
        return(2)
    else
        return(0)
}

或者:

aa<-function(x){
    if ( any( x==c(3,4,5)) ) # a single logical TRUE if any of the "=="-tests are TRUE.
        return (1)
    if ( any( x==c(6,7,8)) )
        return(2)
    else
        return(0)
}
aa(4)
[1] 1