首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >switch()语句用法

switch()语句用法
EN

Stack Overflow用户
提问于 2011-10-20 01:34:54
回答 3查看 149.2K关注 0票数 107

我对R中的switch语句有点困惑。简单地搜索一下这个函数,我得到了一个示例,如下所示:

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

代码语言:javascript
复制
 > 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()的全部吗?有人能给我更多的例子和更好的应用吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-20 02:39:34

好了,又到了救援的时机了。看起来switch通常比if语句更快。因此,使用switch语句的代码更短/更整洁这一事实更倾向于switch

代码语言:javascript
复制
# 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

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

代码语言:javascript
复制
> 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的多功能性:

代码语言:javascript
复制
switch(type, case1=1, case2=, case3=2.5, 99)

这会将case2case3映射到2.5,并将(未命名的)默认值映射到99。有关更多信息,请尝试?switch

票数 120
EN

Stack Overflow用户

发布于 2011-10-20 02:02:35

简而言之,。但有些时候,你可能会偏爱其中之一。谷歌"case switch vs. else“。也有一些讨论已经在进行了。此外,这里有一个很好的视频,在MATLAB的上下文中讨论了它:

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

就我个人而言,当我有3个或更多的案例时,我通常只使用case/switch。

票数 4
EN

Stack Overflow用户

发布于 2021-04-22 23:19:03

开关也比一系列if()语句更容易阅读。这样如何:

代码语言:javascript
复制
switch(id,
   "edit" = {
      CODEBLOCK
   },
   "delete" = {
      CODEBLOCK
   },
   stop(paste0("No handler for ", id))
 )
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7825501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档