switch()语句的用法

我对R中的switch语句有点困惑。简单地用googlesearchfunction,我得到一个例子如下:

开关的常见用法是根据某个函数的某个参数的字符值进行分支。

> 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 

然而,这似乎只是为每种type指定了一堆if语句

这是所有的switch() ? 有人可以给我更多的例子和更好的应用程序?

那么,再次解救的时机。 似乎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 

更新考虑到Joshua的评论,我尝试了其他方法来进行基准testing。 微基准似乎是最好的。 …并显示类似的时机:

 > 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 

最终更新这里展示了多functionswitch用途:

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

这将case2case3映射到2.5 ,(匿名)默认为99 。 有关更多信息,请尝试?switch

总之, 是的 。 但有时候你可能会喜欢一个人而不是另一个。 谷歌“案例切换与其他”。 目前已经有一些讨论了。 此外,这是一个很好的video,在MATLAB的背景下谈到它:

http://blogs.mathworks.com/pick/2008/01/02/matlab-basics-switch-case-vs-if-elseif/

就个人而言,当我有三个或三个以上的情况下,我通常只是与案件/开关。