我对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然而,这似乎与为每个type指定一组if语句是一样的
这就是switch()的全部吗?有人能给我更多的例子和更好的应用吗?
发布于 2011-10-20 02:39:34
好了,又到了救援的时机了。看起来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更新考虑到约书亚的评论,我尝试了其他方法进行基准测试。微基准测试似乎是最好的。...and它显示了类似的时间:
> 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)这会将case2和case3映射到2.5,并将(未命名的)默认值映射到99。有关更多信息,请尝试?switch
发布于 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。
发布于 2021-04-22 23:19:03
开关也比一系列if()语句更容易阅读。这样如何:
switch(id,
"edit" = {
CODEBLOCK
},
"delete" = {
CODEBLOCK
},
stop(paste0("No handler for ", id))
)https://stackoverflow.com/questions/7825501
复制相似问题