R switch()如何将案例与向量进行比较?

时间:2014-07-10 11:11:02

标签: r switch-statement

我在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”或第一段代码来做,但我想了解错误。

4 个答案:

答案 0 :(得分:4)

我确信有更简单的方法,但您可以使用alistdo.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替代方案需要文字名称且不能具有变量名称。您正在命名函数的参数,它们在内部成为列表中项的名称。实际上,在您的第一个示例中,ABC周围不需要“”。知道了,问题变得更加明显。尝试分配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实例,则可以返回多个元素

然后,您可以对结果使用ififelseswitch语句继续。

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 !!!")