Estou um pouco confuso sobre a instrução switch em R. Simplesmente pesquisando a função no Google, recebo um exemplo como segue:
Um uso comum de switch é desviar de acordo com o valor do caractere de um dos argumentos para uma função.
> 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
No entanto, isso parece ser o mesmo que ter um monte de if
declarações designadas para cadatype
Isso é tudo que há para fazer switch()
? Alguém pode me dar mais exemplos e melhores aplicações?
r
switch-statement
LostLin
fonte
fonte
Respostas:
Bem, o tempo para o resgate novamente. Parece
switch
geralmente mais rápido do queif
declarações. Portanto, e o fato de que o código é mais curto / mais puro com umaswitch
declaração, inclina-se a favor deswitch
:Atualização Com o comentário de Joshua em mente, tentei outras maneiras de avaliar. O microbenchmark parece o melhor. ... e mostra tempos semelhantes:
Atualização final Aqui está mostrando como
switch
é versátil :Este mapeia
case2
ecase3
para2.5
e o padrão (sem nome) para99
. Para mais informações, tente?switch
fonte
benchmark(test1('trimmed'), test2('trimmed'), replications=1e6)
.benchmark
função você está usando? Não é o óbvio do pacote "benchmark", parece?microbencmark
, mas eles são muito semelhantes aos meus originais. Eu realmente não vejo como o rbenchmark contornaria o problema do GC, mas parece ter mais sobrecarga chamandoeval
ereplicate
.switch(type, c(this,that)=do something)
Resumindo, sim . Mas há momentos em que você pode favorecer um em relação ao outro. Google "troca de caso vs. if else". Já existem algumas discussões sobre o SO também. Além disso, aqui está um bom vídeo que fala sobre isso no contexto do MATLAB:
http://blogs.mathworks.com/pick/2008/01/02/matlab-basics-switch-case-vs-if-elseif/
Pessoalmente, quando tenho 3 ou mais casos, geralmente só vou com caso / switch.
fonte