Switch语句抛出错误

时间:2016-02-24 12:14:35

标签: r

我想使用switch语句来转换数字。如果案例为1,则数字应为13,案例2应为14等...

因此我写了以下声明:

 settime <- function(time){
     switch(time,
            "1" = 13,
            2 = 14, 
            3 = 15,
            4 = 16,
            5 = 17,
            6 = 18,
            7 = 19,
            8 = 20,
            9 = 21,
            10 = 22,
            11 = 23,
            12 = 24)
   }

然而,这给了我以下错误:

  

错误:意外'='在:“切换(时间,          1 =“

想到我哪里出错了?

2 个答案:

答案 0 :(得分:3)

获得所需内容的更明显方法是使用time + 12。 它比switch更简单,允许您传递矢量而不仅仅是值。

但是因为你的问题可能比你在你的例子中放置的问题更复杂,如果你觉得你需要使用switch(你一次只能传递一个值),并完成我的评论,你有2个选项可以执行此操作,如以下help(switch)示例中所述:

  

开关以两种不同的方式工作,具体取决于第一个参数   计算为字符串或数字。

     

如果EXPR的值不是字符串,则强制转换为   整数。请注意,这也适用于因素,并带有警告   通常是字符级别。如果整数介于1之间   和nargs() - 1然后评估和...的相应元素   结果返回:因此,如果第一个参数是3,那么第四个参数   参数被评估并返回。

     

如果EXPR评估为字符串,则匹配该字符串   (确切地)到......中的元素的名称。如果有匹配   然后评估该元素,除非它被遗漏,在这种情况下   评估下一个非缺失元素,例如switch(“cc”,a =   1,cc =,cd =,d = 2)评估为2.如果有多个匹配,   使用第一个匹配元素。在没有匹配的情况下,如果有   是一个未命名的元素......它的值被返回。 (如果还有更多   一个这样的参数会返回一个错误。)

任何时间都是一个字符变量:

time <- "3"
switch(time, "1"=13, "2"=14, "3"=15, "4"=16)
# [1] 15

或时间是数字:

time <- 3
switch(time, 13, 14, 15, 16)
# [1] 15

答案 1 :(得分:2)

我们可以在不使用任何switch的情况下执行此操作。我不确定大型向量的效率switch。但是,下面的方法应该足够快。

 res <- setNames(13:24, 1:12)[as.character(v1)]
 res
 #4  3  9  7  8 12  4 10 10  4  8  5  9  9  4 11  3  1  7  2  2  7  9  2  3  9 
 #16 15 21 19 20 24 16 22 22 16 20 17 21 21 16 23 15 13 19 14 14 19 21 14 15 21 

从上面可以更容易地删除name

 unname(res)

或者

 as.vector(res)

我们不需要使用as.character,因为元素从1:12开始。但是,如果它是一个不同的向量,那么我们可能需要格外小心。

数据

set.seed(24)
v1 <- sample(1:12, 30, replace=TRUE)