switch()语句用法

Los*_*Lin 104 r switch-statement

我对R中的switch语句有点困惑.只需在googling函数中我得到一个例子,如下所示:

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
Run Code Online (Sandbox Code Playgroud)

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

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

Tom*_*mmy 114

那么,再次拯救的时机.它似乎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
Run Code Online (Sandbox Code Playgroud)

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

> 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
Run Code Online (Sandbox Code Playgroud)

最后更新这里显示了多样性switch:

switch(type, case1=1, case2=, case3=2.5, 99)
Run Code Online (Sandbox Code Playgroud)

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

  • 使用这样的for循环可能会导致垃圾回收问题.具有更好的基准测试功能的差异要小得多:`基准(test1('trimmed'),test2('trimmed'),replications = 1e6)`. (3认同)

归档时间:

查看次数:

145240 次

最近记录:

11 年,8 月 前