我有以下功能
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
答案 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