我在R中的switch语句有一点问题。 以下代码可以......:
value = "B"
switch(value,
"A"={
print("value = A")
},
"B"={
print("value = B")
},
"C"={
print("value = C")
},
{
print("Other !!!")
}
)
它返回:
[1] "value = B"
...但我想将值与矢量的值进行比较,如下所示:
mychr = c("A","B", "C")
value = "B"
switch(value,
mychr[1]={
print(mychr[1])
},
mychr[2]={
print(mychr[2])
},
mychr[3]={
print(mychr[3])
},
{
print("Other !!!")
}
)
这不起作用。
我可以用“if else”或第一段代码来做,但我想了解错误。
答案 0 :(得分:4)
我确信有更简单的方法,但您可以使用alist
和do.call
xlist = c("A","B", "C")
value = "B"
myList <- alist(print(xlist[1]), print(xlist[2]), print(xlist[3]), print("Other !!!"))
myList <- setNames(myList, c(xlist, ''))
do.call(switch, c(EXPR = value, myList))
示例:
> value = "D"
> do.call(switch, c(EXPR = value, myList))
[1] "Other !!!"
> value = "A"
> do.call(switch, c(EXPR = value, myList))
[1] "A"
> value = "C"
> do.call(switch, c(EXPR = value, myList))
[1] "C"
> value = "B"
> do.call(switch, c(EXPR = value, myList))
[1] "B"
答案 1 :(得分:1)
您的错误是switch
替代方案需要文字名称且不能具有变量名称。您正在命名函数的参数,它们在内部成为列表中项的名称。实际上,在您的第一个示例中,A
,B
,C
周围不需要“”。知道了,问题变得更加明显。尝试分配b <- "B"
,然后使用b
作为第二个切换项。这也将失败,因为它不会解析变量名称,只需将其作为文字。在您的情况下,它会因语法问题而失败,因为alist[1]
不是没有引号的有效替代标签。
对其他语言的switch语句也有类似的限制。将交换机中的备选方案视为list
结构中的项目名称。它们几乎可以引用任何内容,但它们不需要引号,然后对它们的内容有限制。他们不能的内容是可变的。
正如您在问题中所认识到的那样,有其他方法可以做到这一点。这是一个比switch
语句快得多的简洁版(即使您设法通过调用函数间接解决变量列表项问题)。
i <- which(alist == value)
if (length(i) == 1){
print( paste0( 'value = ', alist[i]) )
}else {
print( 'Other !!' ) }
答案 2 :(得分:0)
==
运算符适用于向量,因此您需要的只是:
> a <- c("A", "B", "C")
> a
[1] "A" "B" "C"
> b <- "B"
> b == a
[1] FALSE TRUE FALSE
或者,您可以使用which
> which(a == b)
[1] 2
请注意,如果a
包含多个b
实例,则可以返回多个元素
然后,您可以对结果使用if
或ifelse
或switch
语句继续。
PS:你应该避免使用list
作为变量名,因为它是R中的标准函数
答案 3 :(得分:0)
尝试使用vapply
。
即。在你的情况下
vapply(mychr,switch,"",...SWITCH ARGS...)
我认为你想要的是:
vapply(mychr,switch,"",
mychr[1]=mychr[1],mychr[2]=mychr[2],mychr[3]=mychr[3],"Other !!!")