Estoy un poco confundido acerca de la declaración de cambio en R. Simplemente buscando en Google la función obtengo un ejemplo de la siguiente manera:
Un uso común de switch es bifurcar según el valor de carácter de uno de los argumentos de una función.
> 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
Sin embargo, esto parece ser lo mismo que tener un montón de if
declaraciones designadas para cadatype
¿Eso es todo lo que hay que hacer switch()
? ¿Alguien puede darme más ejemplos y mejores aplicaciones?
r
switch-statement
LostLin
fuente
fuente
Respuestas:
Bueno, el tiempo para el rescate de nuevo. Parece que
switch
es generalmente más rápido que lasif
declaraciones. Entonces, y el hecho de que el código sea más corto / ordenado con unaswitch
declaración se inclina a favor deswitch
:Actualización Con el comentario de Joshua en mente, probé otras formas de comparar. El microbenchmark parece el mejor. ... y muestra tiempos similares:
Actualización final A continuación se muestra lo versátil que
switch
es:Esto mapea
case2
ycase3
a2.5
y el valor por defecto (sin nombre) a99
. Para obtener más información, intente?switch
fuente
benchmark(test1('trimmed'), test2('trimmed'), replications=1e6)
.benchmark
función estás usando? ¿No parece el obvio del paquete "benchmark"?microbencmark
, pero son muy similares a los originales. Realmente no veo cómo rbenchmark solucionaría el problema de GC, pero parece tener más gastos generales al llamareval
yreplicate
.switch(type, c(this,that)=do something)
En resumen, sí . Pero hay ocasiones en las que podrías favorecer a uno frente al otro. Google "cambio de caso frente a otro". También hay algunas discusiones sobre SO. Además, aquí hay un buen video que habla de ello en el contexto de MATLAB:
http://blogs.mathworks.com/pick/2008/01/02/matlab-basics-switch-case-vs-if-elseif/
Personalmente, cuando tengo 3 o más casos, suelo ir con caso / interruptor.
fuente