Ich bin ein wenig verwirrt über die switch-Anweisung in R. Wenn ich einfach die Funktion google, erhalte ich ein Beispiel wie folgt:
Eine übliche Verwendung von switch besteht darin, gemäß dem Zeichenwert eines der Argumente zu einer Funktion zu verzweigen.
> 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
Dies scheint jedoch nur das Gleiche zu sein, als würde nur eine Reihe von if
Aussagen für jede bestimmttype
Ist das alles was dazu gehört switch()
? Kann mir jemand weitere Beispiele und bessere Anwendungen geben?
r
switch-statement
LostLin
quelle
quelle
Antworten:
Nun, wieder Zeit für die Rettung. Es scheint
switch
im Allgemeinen schneller alsif
Aussagen. Das und die Tatsache, dass der Code mit einerswitch
Aussage kürzer / ordentlicher ist, spricht fürswitch
:Update Mit Joshuas Kommentar habe ich andere Möglichkeiten zum Benchmarking ausprobiert. Die Mikrobank scheint die beste zu sein. ... und es zeigt ähnliche Zeiten:
Letztes Update Hier sehen Sie, wie vielseitig es
switch
ist:Diese Karten
case2
undcase3
zu2.5
und die (unbenannt) standardmäßig99
. Weitere Informationen erhalten Sie?switch
quelle
benchmark(test1('trimmed'), test2('trimmed'), replications=1e6)
.benchmark
Funktion benutzt du? Nicht die offensichtliche aus dem "Benchmark" -Paket, wie es scheint?microbencmark
, aber sie sind meinen ursprünglichen sehr ähnlich. Ich sehe nicht wirklich, wie rbenchmark das GC-Problem umgehen würde, aber es scheint mehr Overhead zu haben, wenn maneval
und anruftreplicate
.switch(type, c(this,that)=do something)
Kurz gesagt, ja . Aber es gibt Zeiten, in denen Sie das eine gegenüber dem anderen bevorzugen. Google "case switch vs. if else". Es gibt bereits einige Diskussionen über SO. Hier ist auch ein gutes Video, das im Kontext von MATLAB darüber spricht:
http://blogs.mathworks.com/pick/2008/01/02/matlab-basics-switch-case-vs-if-elseif/
Persönlich, wenn ich 3 oder mehr Fälle habe, gehe ich normalerweise einfach mit Fall / Schalter.
quelle