我在这里犯了什么错误?如果其中三个语句中的任何一个为真,我都试图为a
和b
分配一些值。我正在尝试使用ifelse
语句:
ifelse(1==1||2==2||3==3, (a<-100,b<-100), (a<-1000,b<-1000))
但是我得到一个错误:
错误:“ ifelse(1 == 1 || 2 == 2 || 3 == 3,(a <-100,“
编辑:
按照更一般的方式,有两个变量a和b需要根据条件分配不同的值:if(x ==“ cat”或x ==“ dog”或x ==“ horse”,那么a是100,b是200,否则a是500,b是1000)
答案 0 :(得分:1)
两条评论:
||
是短路逻辑或,它不是矢量化的,只会使用第一个元素。如果您在此处使用了变量,则应该得到警告。ifelse
是一个函数,而不是流控制,因此您应该将其值分配给变量,而不要尝试在函数参数中进行分配。所以我认为您真正想要的是:
a <- b <- ifelse(1 == 1 | 2 == 2 | 3 == 3, 100, 1000)
答案 1 :(得分:1)
您可以将R中的var manager = new ApplicationUserManager(userStore, new EmailService());
视为对3个向量进行运算的函数:
ifelse()
部分。1==3 | 2==2 | 3==3
部分。a <- 100
部分。所有3个向量的长度都应相同。
这是一个快速演示:
a <- 1000
vec1 <- 1:10 > 3 & 1:10 < 7
> vec1
[1] FALSE FALSE FALSE TRUE TRUE TRUE FALSE FALSE FALSE FALSE
vec2 <- LETTERS[1:10]
> vec2
[1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J"
vec3 <- letters[1:10]
> vec3
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"
函数将ifelse()
和vec2
组合成一个新的向量,其中根据{的值,从vec3
和vec2
中提取元素{1}}。
vec3
要更好地了解其工作原理,请使用表格形式的所有内容(由@Gregor建议)。
vec1
您尝试的方法的问题在于ifelse(vec1, vec2, vec3)
[1] "a" "b" "c" "D" "E" "F" "g" "h" "i" "j"
被误解了。您尝试分配值,而不是向> rbind(vec1, vec2, vec3, result=ifelse(vec1, vec2, vec3))
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
vec1 "FALSE" "FALSE" "FALSE" "TRUE" "TRUE" "TRUE" "FALSE" "FALSE" "FALSE" "FALSE"
vec2 "A" "B" "C" "D" "E" "F" "G" "H" "I" "J"
vec3 "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"
result "a" "b" "c" "D" "E" "F" "g" "h" "i" "j"
函数提供第二和第三向量。
在您的情况下,仍使用ifelse()
的解决方案将执行两次:
ifelse()
注意:在上面的示例中,提供了单个值ifelse()
而不是向量。但是R将扩展它的长度以匹配第一个向量的长度。因此,单个值是可以接受的,但可以在后台扩展为向量。
答案 2 :(得分:1)
回答OP在评论中很好地陈述的问题:
如果(x ==“ cat”或x ==“ dog”或x ==“ horse”,那么a为100,b为200,否则a为500而b为1000)
'['
使用if (x == "cat" || x == "dog" || x == "horse") {
a = 100
b = 200
} else {
a = 500
b = 1000
}
代替%in%
可以做得更好-效果很好,尤其是当您需要检查更多的值时
|
if (x %in% c("cat", "dog", "horse")) {
a = 100
b = 200
} else {
a = 500
b = 1000
}
是返回向量的向量化函数。如果要“执行”操作,或为每个测试条件返回一个以上的值,则ifelse
是合适的。