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

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

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

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

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



답변

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

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

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


답변

그 다양한 전환 방법

# 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"


답변

이 예제가 도움이되기를 바랍니다. 중괄호를 사용하여 스위처 체인저 녀석 안에 모든 것이 포함되어 있는지 확인합니다 (미안하지만 기술 용어는 모르지만 = 기호 앞에 오는 용어는 무슨 일이 일어나는지 변경합니다). 저는 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")


답변

이것은 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
}


답변