Jestem trochę zdezorientowany co do instrukcji switch w R. Po prostu wyszukując w Google funkcję, otrzymuję następujący przykład:
Typowym zastosowaniem przełącznika jest rozgałęzianie zgodnie z wartością znaku jednego z argumentów funkcji.
> 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
Jednak wydaje się to być tym samym, co po prostu posiadanie zestawu if
instrukcji przeznaczonych dla każdegotype
Czy to wszystko, co trzeba switch()
? Czy ktoś może mi podać dalsze przykłady i lepsze zastosowania?
r
switch-statement
LostLin
źródło
źródło
Odpowiedzi:
Cóż, znowu czas na ratunek. Wydaje się, że
switch
jest generalnie szybszy niżif
oświadczenia. Tak więc, a fakt, że kod jest krótszy / schludniejszy zswitch
oświadczeniem, przechyla się na korzyśćswitch
:Aktualizacja Mając na uwadze komentarz Joshuy, wypróbowałem inne sposoby analizy porównawczej. Mikroznak wydaje się najlepszy. ... i pokazuje podobne czasy:
Ostatnia aktualizacja Oto jak wszechstronny
switch
jest:To mapuje
case2
icase3
do2.5
i (nienazwany) domyślnie99
. Aby uzyskać więcej informacji, spróbuj?switch
źródło
benchmark(test1('trimmed'), test2('trimmed'), replications=1e6)
.benchmark
funkcji używasz? Wydaje się, że nie jest to oczywiste z pakietu „benchmark”?microbencmark
, ale są one bardzo podobne do moich oryginalnych. Naprawdę nie rozumiem, jak rbenchmark poradziłby sobie z problemem GC, ale wydaje się, że ma więcej narzutów, wywołująceval
ireplicate
.switch(type, c(this,that)=do something)
Krótko mówiąc, tak . Ale są chwile, kiedy możesz faworyzować jedno przeciwko drugiemu. Google „zmiana przypadku a jeśli jeszcze”. Trwają już dyskusje na temat SO. Tutaj jest również dobry film, który mówi o tym w kontekście MATLAB:
http://blogs.mathworks.com/pick/2008/01/02/matlab-basics-switch-case-vs-if-elseif/
Osobiście, gdy mam 3 lub więcej przypadków, zwykle wybieram po prostu obudowę / przełącznik.
źródło