R의 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()
입니까? 누군가 나에게 더 많은 예제와 더 나은 응용 프로그램을 줄 수 있습니까?
답변
글쎄, 다시 구출 타이밍. 보인다 switch
일반적으로 빨리보다 if
문. 그래서 코드가 더 짧고 깔끔하다는 사실은 다음 switch
을 선호합니다 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
업데이트 Joshua의 의견을 염두에두고 다른 방법으로 벤치마킹을 시도했습니다. 마이크로 벤치 마크가 가장 좋은 것 같습니다. … 그리고 유사한 타이밍을 보여줍니다.
> 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
최종 업데이트 다재다능한 기능을 보여줍니다 switch
.
switch(type, case1=1, case2=, case3=2.5, 99)
이 매핑 case2
및 case3
에 2.5
및 (이름 없음) 기본값은 99
. 자세한 내용은?switch
답변
요컨대, 그렇습니다 . 그러나 당신이 하나를 선호 할 때가 있습니다. Google “케이스 전환 vs. 다른 경우”. 그래서 이미 몇 가지 토론이 있습니다. 또한 다음은 MATLAB 컨텍스트에서 이에 대해 설명하는 좋은 비디오입니다.
http://blogs.mathworks.com/pick/2008/01/02/matlab-basics-switch-case-vs-if-elseif/
개인적으로 케이스가 3 개 이상일 때는 보통 케이스 / 스위치 만 사용합니다.