Я немного смущен оператором switch в R. Просто поискав функцию в Google, я получаю следующий пример:
Обычно переключатель switch используется для перехода в соответствии со значением символа одного из аргументов функции.
> 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
Однако это похоже на то, что if
для каждогоtype
Это все, что нужно switch()
? Может кто-нибудь дать мне дополнительные примеры и лучшие приложения?
r
switch-statement
LostLin
источник
источник
Ответы:
Что ж, время снова приходит на помощь. Вроде
switch
вообще быстрееif
заявлений. Так что и тот факт, что код короче / аккуратнее сswitch
утверждением, склоняется в пользуswitch
:Обновление Помня комментарий Джошуа, я попробовал другие способы тестирования. Микробенчмарк кажется лучшим. ... и он показывает похожие тайминги:
Заключительное обновление Здесь показано, насколько универсален
switch
:Это сопоставляет
case2
иcase3
с2.5
(безымянным) по умолчанию99
. Для получения дополнительной информации попробуйте?switch
источник
benchmark(test1('trimmed'), test2('trimmed'), replications=1e6)
.benchmark
функцию вы используете? Кажется, не тот очевидный из «тестового» пакета?microbencmark
, но они очень похожи на мои исходные. Я действительно не понимаю, как rbenchmark может решить проблему с GC, но, похоже, у него больше накладных расходов, вызываяeval
иreplicate
.switch(type, c(this,that)=do something)
Короче да . Но бывают случаи, когда вы можете отдать предпочтение одному против другого. Гугл "переключение регистра vs. если еще". По SO тоже уже ведутся дискуссии. Кроме того, вот хорошее видео, в котором говорится об этом в контексте MATLAB:
http://blogs.mathworks.com/pick/2008/01/02/matlab-basics-switch-case-vs-if-elseif/
Лично, когда у меня 3 или более чемодана, я обычно использую чехол / переключатель.
источник