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)
这将case2
和case3
映射到2.5
,(匿名)默认为99
。 有关更多信息,请尝试?switch
总之, 是的 。 但有时候你可能会喜欢一个人而不是另一个。 谷歌“案例切换与其他”。 目前已经有一些讨论了。 此外,这是一个很好的video,在MATLAB的背景下谈到它:
http://blogs.mathworks.com/pick/2008/01/02/matlab-basics-switch-case-vs-if-elseif/
就个人而言,当我有三个或三个以上的情况下,我通常只是与案件/开关。