स्विच () विवरण उपयोग


106

मैं आर में स्विच स्टेटमेंट के बारे में थोड़ा उलझन में हूं। बस इस फ़ंक्शन को शुरू करने के बाद मुझे एक उदाहरण मिलता है:

स्विच का एक सामान्य उपयोग किसी फ़ंक्शन के तर्कों के चरित्र मूल्य के अनुसार शाखा है।

 > 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()? क्या कोई मुझे आगे के उदाहरण और बेहतर आवेदन दे सकता है?


10
हां, बस इतना ही है।
एंड्री

जवाबों:


119

खैर, बचाव के लिए फिर से समय। ऐसा लगता है 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

अपडेट यहोशू की टिप्पणी को ध्यान में रखते हुए, मैंने बेंचमार्क करने के अन्य तरीकों की कोशिश की। Microbenchmark सबसे अच्छा लगता है। ... और यह समान समय दिखाता है:

> 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


3
लूप के लिए उपयोग करना जैसे कि कचरा संग्रह के मुद्दों को पैदा कर सकता है। अंतर एक बेहतर बेंचमार्किंग फ़ंक्शन के साथ बहुत छोटा है benchmark(test1('trimmed'), test2('trimmed'), replications=1e6):।
जोशुआ उलरिच

@JoshuaUlrich ... आप किस benchmarkफ़ंक्शन का उपयोग कर रहे हैं? ऐसा लगता है कि "बेंचमार्क" पैकेज से स्पष्ट नहीं है?
टॉमी

1
के अनुसार stackoverflow.com/questions/6262203/... "microbenchmark" एक और भी बेहतर से एक है।
टॉमी

@JoshuaUlrich - मैंने परिणामों से उत्तर अपडेट किया microbencmark, लेकिन वे मेरे मूल के समान हैं। मैं वास्तव में नहीं देखता कि कैसे rbenchmark को GC इश्यू के आसपास मिलेगा, लेकिन ऐसा लगता है कि कॉल करने से evalऔर अधिक ओवरहेड हो जाएगा replicate
टॉमी

बस के रूप में एक तरफ मैं एक ही उत्पादन के साथ कई मामलों हो सकता है? यानीswitch(type, c(this,that)=do something)
लॉटलिन

4

संक्षेप में, हाँ । लेकिन कई बार आप एक बनाम दूसरे का पक्ष ले सकते हैं। Google "केस स्विच बनाम अगर और"। एसओ पर भी कुछ चर्चाएं पहले से हैं। इसके अलावा, यहां एक अच्छा वीडियो है जो MATLAB के संदर्भ में इसके बारे में बात करता है:

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

व्यक्तिगत रूप से, जब मेरे पास 3 या अधिक मामले हैं, तो मैं आमतौर पर केस / स्विच के साथ जाता हूं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.