2011-10-19 14 views
92

मैं एक छोटे से आर में स्विच बयान के बारे में उलझन में हूँ, बस समारोह googling मैं एक उदाहरण के रूप में निम्न प्रकार है:स्विच() बयान उपयोग

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

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

+7

हां, यह सब कुछ है। – Andrie

उत्तर

95

ठीक है, बचाव के लिए समय फिर से। ऐसा लगता है कि switch आमतौर पर if कथन से अधिक तेज़ है। ताकि, और तथ्य यह है कि कोड में कम है/एक switch बयान के साथ neater switch के पक्ष में leans:

# 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 

अद्यतन मन में जोशुआ की टिप्पणी के साथ, मैं बेंचमार्क करने के अन्य तरीके की कोशिश की। माइक्रोबेंमार्क सबसे अच्छा लगता है। ... और यह पता चलता समान समय:

> 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

+2

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

+0

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

+1

क्षमा करें, मैं rbenchmark पैकेज का उपयोग कर रहा था। –

2

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

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

व्यक्तिगत रूप से, जब मैं 3 या उससे अधिक मामलों है, मैं आम तौर पर सिर्फ मामले/स्विच के साथ जाना: इसके अलावा, यहाँ एक अच्छा वीडियो है कि MATLAB के संदर्भ में यह बारे में बात करती है।

संबंधित मुद्दे