R Language Definition - 3.2.6 switch

R Language Definition - 3.2.6 switch

switch는 엄밀히 말하면 그냥 또 하나의 함수일 뿐이지만, 그 의미론은 다른 프로그래밍 언어의 제어 구조와 매우 가깝습니다.
문법은 다음과 같아요.

switch (statement, list)

여기서 list의 원소에는 이름을 붙일 수 있습니다.
먼저 statement가 평가되고, 그 결과인 value가 얻어집니다.
만약 value가 1부터 list의 길이 사이의 숫자라면, list의 해당 원소가 평가되고 그 결과가 반환됩니다.
value가 너무 크거나 너무 작으면 NULL이 반환됩니다.

> x <- 3
> switch(x, 2+2, mean(1:10), rnorm(5))
[1]  2.2903605  2.3271663 -0.7060073  1.3622045 -0.2892720
> switch(2, 2+2, mean(1:10), rnorm(5))
[1] 5.5
> switch(6, 2+2, mean(1:10), rnorm(5))
NULL

만약 value가 문자형 벡터라면, ...의 원소 중 이름이 value와 정확히 일치하는 것이 평가됩니다.
일치하는 항목이 없으면 이름 없는 단일 인수가 기본값으로 사용됩니다.
기본값이 지정되지 않았다면 NULL이 반환됩니다.

> y <- "fruit"
> switch(y, fruit = "banana", vegetable = "broccoli", "Neither")
[1] "banana"
> y <- "meat"
> switch(y, fruit = "banana", vegetable = "broccoli", "Neither")
[1] "Neither"

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

switch는 평가된 구문의 값을 반환하거나, 어떤 구문도 평가되지 않았으면 NULL을 반환합니다.

이미 존재하는 대안 목록 중에서 하나를 선택해 평가할 때는 switch가 최선의 방법이 아닐 수 있어요.
이런 경우에는 eval과 부분집합 연산자 [[를 직접 사용해서 eval(x[[condition]])처럼 하는 편이 더 나을 때가 많습니다.

더 알아보기 (Learn more)

출처: R Language Definition - switch