স্যুইচ () বিবৃতি ব্যবহার


106

আমি আর-এ স্যুইচ স্টেটমেন্টটি সম্পর্কে কিছুটা বিভ্রান্ত হয়ে পড়েছি Simp

কোনও ফাংশনে আর্গুমেন্টগুলির মধ্যে একটির চরিত্রের মান অনুযায়ী স্যুইচটির একটি সাধারণ ব্যবহার শাখা করা।

 > 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

জোশুয়ার মন্তব্যটিকে মাথায় রেখে আপডেট করুন, আমি বেঞ্চমার্কের অন্যান্য উপায় চেষ্টা করেছি। মাইক্রোব্যাঙ্কমার্কটি সবচেয়ে ভাল বলে মনে হচ্ছে। ... এবং এটি একই সময় দেখায়:

> 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)
জোশুয়া আলরিখ

@ জোশুয়াউলিরিচ ... আপনি কোন benchmarkঅনুষ্ঠানটি ব্যবহার করছেন? "বেঞ্চমার্ক" প্যাকেজটি সুস্পষ্ট বলে মনে হচ্ছে না?
টমি

1
মতে stackoverflow.com/questions/6262203/... "microbenchmark" একটি আরো উন্নত অন্যতম।
টমি

@ জোশুয়া অলিরিচ - আমি ফলাফলগুলি দিয়ে উত্তরটি আপডেট করেছি microbencmark, তবে সেগুলি আমার মূলগুলির সাথে খুব মিল। জিসি ইস্যুতে আরবেনমার্ক কীভাবে উঠবে তা আমি সত্যিই দেখছি না, তবে কল করে evalএবং replicate
টমি

ঠিক যেমন আমি একপাশে একই আউটপুট সঙ্গে একাধিক কেস থাকতে পারে? যেমনswitch(type, c(this,that)=do something)
লস্টলিন

4

সংক্ষেপে, হ্যাঁ । তবে এমন সময় রয়েছে যখন আপনি একটির তুলনায় অন্যটির পক্ষে পছন্দ করতে পারেন। গুগল "কেস স্যুইচ বনাম অন্যথায় যদি"। এসও নিয়ে ইতিমধ্যে কিছু আলোচনা রয়েছে। এছাড়াও, এখানে একটি ভাল ভিডিও যা ম্যাটল্যাবের প্রসঙ্গে এটি সম্পর্কে কথা বলছে:

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

ব্যক্তিগতভাবে, যখন আমার 3 বা ততোধিক মামলা হয় আমি সাধারণত কেস / স্যুইচ দিয়ে যাই।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.