R 함수에서 switch 문을 사용하는 방법은 무엇입니까?


81

switch()함수의 인수 값에 따라 다른 계산을 트리거하기 위해 R에서 내 함수를 사용하고 싶습니다 .

예를 들어 Matlab에서는 다음과 같이 작성할 수 있습니다.

switch(AA)        
case '1'   
...   
case '2'   
...   
case '3'  
...  
end

나는이 post- switch () 문 사용법을 발견했습니다 . 사용 방법을 설명 switch하지만 단순한 mean.가 아닌 더 복잡한 계산 (행렬 연산)을 수행하고 싶기 때문에 실제로 도움이되지 않습니다 .

답변:


112

글쎄, switch아마도 이렇게 작동하도록 의도 된 것은 아니지만 다음과 같이 할 수 있습니다.

AA = 'foo'
switch(AA, 
foo={
  # case 'foo' here...
  print('foo')
},
bar={
  # case 'bar' here...
  print('bar')    
},
{
   print('default')
}
)

... 각 케이스는 표현식입니다. 일반적으로 단순한 일이지만 여기에서는 원하는 코드를 입력 할 수 있도록 곱슬 블록을 사용합니다.


6
문자열과 비교하지 않고 이것을 수행하는 방법이 있습니까? 비효율적으로 보입니다.
Jules GM

10
의 새로운 사용자로서 switch()왜 이렇게 작동하지 않는다고 말하는지 궁금합니다. switch 문이 수행 할 다른 작업은 무엇입니까?
eric_kernfeld 20:48에

46

그 다양한 전환 방법 ...

# by index
switch(1, "one", "two")
## [1] "one"


# by index with complex expressions
switch(2, {"one"}, {"two"})
## [1] "two"


# by index with complex named expression
switch(1, foo={"one"}, bar={"two"})
## [1] "one"


# by name with complex named expression
switch("bar", foo={"one"}, bar={"two"})
## [1] "two"

42

이 예제가 도움이되기를 바랍니다. 중괄호를 사용하여 스위처 체인저 녀석 안에 모든 것이 포함되어 있는지 확인합니다 (미안하지만 기술 용어는 모르지만 = 기호 앞에 오는 용어는 무슨 일이 일어나는지 변경합니다). 저는 switch를 좀 더 통제 된 if () {} else {}문장 으로 생각 합니다.

스위치 기능이 동일 할 때마다 우리가 제공하는 명령이 변경됩니다.

do.this <- "T1"

switch(do.this,
    T1={X <- t(mtcars)
        colSums(mtcars)%*%X
    },
    T2={X <- colMeans(mtcars)
        outer(X, X)
    },
    stop("Enter something that switches me!")
)
#########################################################
do.this <- "T2"

switch(do.this,
    T1={X <- t(mtcars)
        colSums(mtcars)%*%X
    },
    T2={X <- colMeans(mtcars)
        outer(X, X)
    },
    stop("Enter something that switches me!")
)
########################################################
do.this <- "T3"

switch(do.this,
    T1={X <- t(mtcars)
        colSums(mtcars)%*%X
    },
    T2={X <- colMeans(mtcars)
        outer(X, X)
    },
    stop("Enter something that switches me!")
)

다음은 함수 내부입니다.

FUN <- function(df, do.this){
    switch(do.this,
        T1={X <- t(df)
            P <- colSums(df)%*%X
        },
        T2={X <- colMeans(df)
            P <- outer(X, X)
        },
        stop("Enter something that switches me!")
    )
    return(P)
}

FUN(mtcars, "T1")
FUN(mtcars, "T2")
FUN(mtcars, "T3")

0

이것은 R에서 누락 된 "Select cond1, stmt1, ... else stmtelse"구성에 대한보다 일반적인 대답입니다. 약간 가스가 많지만 C에있는 switch 문과 유사하게 작동합니다.

while (TRUE) {
  if (is.na(val)) {
    val <- "NULL"
    break
  }
  if (inherits(val, "POSIXct") || inherits(val, "POSIXt")) {
    val <- paste0("#",  format(val, "%Y-%m-%d %H:%M:%S"), "#")
    break
  }
  if (inherits(val, "Date")) {
    val <- paste0("#",  format(val, "%Y-%m-%d"), "#")
    break
  }
  if (is.numeric(val)) break
  val <- paste0("'", gsub("'", "''", val), "'")
  break
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.