[解決済み] 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)
このマップは
case2
と
case3
から
2.5
に変更し、(無名の)デフォルトを
99
. より詳しい情報は
?switch
関連
-
[解決済み】Java:サブクラス下のenumでswitchステートメントを使用する
-
[解決済み] Rubyのswitch文の書き方
-
[解決済み] Pythonのswitch文の代用品?
-
[解決済み] switch文の中で変数を宣言してはいけないのはなぜですか?
-
[解決済み] Stringでswitch文が使えないのはなぜですか?
-
[解決済み] JavaScriptで複数ケースを扱うSwitch文
-
[解決済み] switch文の複数ケース
-
[解決済み] C#のSwitch文のフォールスルー?
-
[解決済み】1つのswitch case文に2つの値を使用する場合
-
[解決済み】Rスクリプトで警告をグローバルに抑制する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
ggplot2 からグリッドと背景色を削除する。
-
R言語ダウンロード機能 download.fileとダウンロード解析
-
[解決済み] Rでデータフレームに行を追加する方法は?
-
[解決済み] ggplot 2.0.0でのポイントサイズ
-
[解決済み] R:自然対数を使った方程式をnlsで使う
-
[解決済み] Rの代入演算子"="と"<-"の違いは何ですか?
-
[解決済み] 非常に大きなテーブルをデータフレームとして高速に読み込む
-
[解決済み] Rでロードされているパッケージのバージョンを調べるには?
-
[解決済み】set.seed関数を使用する理由
-
[解決済み] 2つの単語の最初の文字を大文字にします。