Je suis un peu confus au sujet de l'instruction switch dans R. Simplement googler la fonction, j'obtiens un exemple comme suit:
Une utilisation courante du commutateur consiste à créer une branche en fonction de la valeur de caractère de l'un des arguments d'une fonction.
> 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
Cependant, cela semble être la même chose que d'avoir simplement un tas d' if
énoncés désignés pour chaquetype
Est-ce tout ce qu'il y a à faire switch()
? Quelqu'un peut-il me donner d'autres exemples et de meilleures applications?
r
switch-statement
LostLin
la source
la source
Réponses:
Eh bien, le moment est venu à la rescousse. Cela semble
switch
généralement plus rapide que lesif
déclarations. Donc, et le fait que le code soit plus court / plus net avec uneswitch
instruction penche en faveur deswitch
:Mise à jour Avec le commentaire de Joshua à l'esprit, j'ai essayé d'autres moyens de comparer. Le microbenchmark semble le meilleur. ... et il montre des horaires similaires:
Dernière mise à jour Voici à quel point la polyvalence
switch
est:Ce mappe
case2
etcase3
à2.5
et le (sans nom) par défaut à99
. Pour plus d'informations, essayez?switch
la source
benchmark(test1('trimmed'), test2('trimmed'), replications=1e6)
.benchmark
fonction utilisez-vous? Pas le plus évident du package "benchmark" semble-t-il?microbencmark
, mais ils sont très similaires à ceux d'origine. Je ne vois pas vraiment comment rbenchmark contournerait le problème du GC, mais il semble avoir plus de frais généraux en appelanteval
etreplicate
.switch(type, c(this,that)=do something)
Bref oui . Mais il y a des moments où vous pourriez favoriser l'un par rapport à l'autre. Google "commutateur de cas vs if else". Il y a déjà des discussions sur SO aussi. Aussi, voici une bonne vidéo qui en parle dans le contexte de MATLAB:
http://blogs.mathworks.com/pick/2008/01/02/matlab-basics-switch-case-vs-if-elseif/
Personnellement, quand j'ai 3 cas ou plus, je vais généralement simplement avec cas / interrupteur.
la source