if else函数返回的不是我要求的

时间:2015-08-29 08:07:59

标签: r if-statement data-manipulation

我有以下功能

clear all current history

然后我尝试以下方法:

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)不会返回1和aa(5)并且aa(7)将不会返回2.如何更正我的代码以使值3,4或5返回1,而6,7或8返回2,否则返回0

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

这样就可以了解

aa(4)
[1] 1

然后我

|

请注意tabindex是&#34;或&#34;操作

答案 2 :(得分:1)

为什么呢? ... 你问。您应该看到一条警告信息(事实上其中两条),您没有告诉我们。

> 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