it-swarm-id.com

switch () penggunaan pernyataan

Saya sedikit bingung tentang pernyataan switch di R. Cukup googling fungsi saya mendapatkan contoh sebagai berikut:

Penggunaan switch yang umum adalah untuk bercabang sesuai dengan nilai karakter dari salah satu argumen ke fungsi.

 > 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

Namun ini sepertinya sama dengan hanya memiliki banyak if pernyataan yang ditujukan untuk setiap type

Apakah hanya itu yang ada untuk switch()? Dapatkah seseorang memberi saya contoh lebih lanjut dan aplikasi yang lebih baik?

104
LostLin

Nah, waktunya untuk menyelamatkan lagi. Tampaknya switch umumnya lebih cepat daripada pernyataan if. Jadi itu, dan fakta bahwa kode lebih pendek/lebih rapi dengan pernyataan switch bersandar mendukung 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

Perbarui Dengan mengingat komentar Joshua, saya mencoba cara lain untuk membuat tolok ukur. Microbenchmark tampaknya yang terbaik. ... dan itu menunjukkan timing yang serupa:

> 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

Pembaruan Akhir Berikut ini menunjukkan bagaimana serbaguna switch adalah:

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

Ini memetakan case2 dan case3 ke 2.5 dan default (tanpa nama) ke 99. Untuk informasi lebih lanjut, coba ?switch

113
Tommy

Singkatnya, ya . Tetapi ada saat-saat di mana Anda mungkin menyukai yang satu vs yang lain. Google "beralih huruf vs. jika lain". Sudah ada beberapa diskusi di SO juga. Juga, berikut adalah video bagus yang membicarakannya dalam konteks MATLAB:

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

Secara pribadi, ketika saya memiliki 3 case atau lebih, saya biasanya hanya menggunakan case/switch.

4
John Colby