107 votes

instruction switch() utilisation de la

Je suis un peu confus au sujet de l'instruction switch dans R. Simplement googler la fonction-je obtenir un exemple de la manière suivante:

Une utilisation courante de changement de direction selon la valeur du caractère de l'un des arguments à 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

Toutefois, cela semble juste être la même que d'avoir un tas d' if états désignés pour chaque type

C'est que tout y est-à - switch()? Quelqu'un peut-il me donner d'autres exemples et de meilleures applications?

120voto

Tommy Points 16323

Ainsi, le calendrier à nouveau à la rescousse. Il semble switch est généralement plus rapide qu' ifdes déclarations. De sorte que, et le fait que le code est plus court/plus soignée avec un switch déclaration se penche en faveur de l' 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

Mise à jour Avec Joshua commentaire dans l'esprit, j'ai essayé d'autres façons de référence. Le microbenchmark semble la meilleure. ...et il montre les mêmes périodes:

> 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

Dernière mise à Jour, Voici en montrant comment polyvalent switch est:

switch(type, case1=1, case2=, case3=2.5, 99)

Cette maps case2 et case3 de 2.5 et l' (sans nom) par défaut 99. Pour plus d'informations, essayez ?switch

4voto

John Colby Points 10530

En bref, oui. Mais il ya des moments où vous pourriez favoriser l'un contre l'autre. Google "switch vs si d'autre". Il y a quelques discussions déjà sur DONC trop. 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, j'ai l'habitude de simplement aller avec cas/commutateur.

0voto

user3524062 Points 1

En général, avec , vous pouvez gérer la Collecte des Ordures vous-même.

Par exemple:

names(k)<-NULL;k;rm(k);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X