1. ホーム
  2. r

[解決済み] switch() 文の使用法

2022-12-05 20:32:08

質問

Rのswitch文について、少し混乱しています。 単に関数をググると、次のような例が得られます。

switchの一般的な使用法は、関数への引数の1つの文字値に従って分岐することです。

 > 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

しかし、これではただ単に、たくさんの if ステートメントを持つのと同じです。 type

はこれで終わりですか? 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のコメントを念頭に置き、他のベンチマーク方法を試してみました。マイクロベンチマークが最も優れているようです。...そしてそれは同様のタイミングを示しています。

> 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)

このマップは case2case3 から 2.5 に変更し、(無名の)デフォルトを 99 . より詳しい情報は ?switch