switch()语句用法


106

我对R中的switch语句有些困惑。只需对函数进行谷歌搜索,就可以看到如下示例:

switch的常见用法是根据其中一个参数的字符值跳转到函数。

 > centre <- function(x, type) {
 + switch(type,
 +        mean = mean(x),
 +        median = median(x),
 +        trimmed = mean(x, trim = .1))
 + }
 > x <- rcauchy(10)
 > centre(x, "mean")
 [1] 0.8760325
 > centre(x, "median")
 [1] 0.5360891
 > centre(x, "trimmed")
 [1] 0.6086504

但是,这似乎与if为每个语句指定一堆语句相同。type

这就是全部switch()吗?有人可以给我更多示例和更好的应用程序吗?


10
是的,仅此而已。
Andrie

Answers:


119

好了,再次进行救援。它似乎switch通常比if语句快。因此,代码更短/更整洁并带有一条switch语句的事实倾向于switch

# Simplified to only measure the overhead of switch vs if

test1 <- function(type) {
 switch(type,
        mean = 1,
        median = 2,
        trimmed = 3)
}

test2 <- function(type) {
 if (type == "mean") 1
 else if (type == "median") 2
 else if (type == "trimmed") 3
}

system.time( for(i in 1:1e6) test1('mean') ) # 0.89 secs
system.time( for(i in 1:1e6) test2('mean') ) # 1.13 secs
system.time( for(i in 1:1e6) test1('trimmed') ) # 0.89 secs
system.time( for(i in 1:1e6) test2('trimmed') ) # 2.28 secs

更新考虑到约书亚的评论,我尝试了其他基准测试方法。微基准测试似乎是最好的。...并且显示了类似的时间安排:

> library(microbenchmark)
> microbenchmark(test1('mean'), test2('mean'), times=1e6)
Unit: nanoseconds
           expr  min   lq median   uq      max
1 test1("mean")  709  771    864  951 16122411
2 test2("mean") 1007 1073   1147 1223  8012202

> microbenchmark(test1('trimmed'), test2('trimmed'), times=1e6)
Unit: nanoseconds
              expr  min   lq median   uq      max
1 test1("trimmed")  733  792    843  944 60440833
2 test2("trimmed") 2022 2133   2203 2309 60814430

最终更新这里显示了通用性switch

switch(type, case1=1, case2=, case3=2.5, 99)

这个地图 case2case32.5和(未命名)默认99。有关更多信息,请尝试?switch


3
使用这样的for循环可能会导致垃圾回收问题。两者之间的差异要小得多,并具有更好的基准测试功能:benchmark(test1('trimmed'), test2('trimmed'), replications=1e6)
约书亚·乌尔里希

@JoshuaUlrich ... benchmark您正在使用哪个功能?从“基准”软件包看来,不是显而易见的一个吗?
汤米”,


@JoshuaUlrich-我使用的结果更新了答案microbencmark,但它们与我的原始结果非常相似。我真的不知道rbenchmark如何解决GC问题,但是通过调用eval和似乎有更多的开销replicate
汤米”,

顺便说一句,我可以有多个具有相同输出的案例吗?即switch(type, c(this,that)=do something)
LostLin 2011年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.