R의 ifelse 문이 때때로 매우 편리하다는 것을 알았습니다. 예를 들면 :
ifelse(TRUE,1,2)
# [1] 1
ifelse(FALSE,1,2)
# [1] 2
그러나 나는 다음과 같은 행동으로 다소 혼란 스럽습니다.
ifelse(TRUE,c(1,2),c(3,4))
# [1] 1
ifelse(FALSE,c(1,2),c(3,4))
# [1] 3
이것은 내 급여보다 높은 디자인 선택입니까?
답변
ifelse
상태에 대한 문서 :
ifelse
의 요소 가 또는 인지에 따라 또는
test
에서 선택한 요소로 채워진 동일한 모양의 값을 반환합니다 .yes
no
test
TRUE
FALSE
길이 1의 테스트 값을 통과하므로 길이 1의 결과를 얻게됩니다. 더 긴 테스트 벡터를 통과하면 더 긴 결과를 얻을 수 있습니다.
> ifelse(c(TRUE, FALSE), c(1, 2), c(3, 4))
[1] 1 4
따라서 ifelse
부울 벡터를 테스트하고 (벡터) yes
및 no
인수 에서 가져온 요소로 채워진 동일한 길이의 벡터를 반환하는 특정 목적을위한 것입니다 .
함수의 이름으로 인해 실제로 정상적인 if () {} else {}
구성 을 원할 때 이것을 사용하는 것은 일반적인 혼란 입니다.
답변
if
대신 간단한 문 을 원할 것입니다 ifelse
-R에서는 if
단순한 제어 흐름 구조가 아니라 값을 반환 할 수 있습니다.
> if(TRUE) c(1,2) else c(3,4)
[1] 1 2
> if(FALSE) c(1,2) else c(3,4)
[1] 3 4
답변
내부에 결과를 할당하면 문제를 피할 수 있습니다 ifelse
.
ifelse(TRUE, a <- c(1,2), a <- c(3,4))
a
# [1] 1 2
ifelse(FALSE, a <- c(1,2), a <- c(3,4))
a
# [1] 3 4
답변
네, ifelse ()는 정말 긴 테스트 벡터를 가지고 있고 각각 두 가지 옵션 중 하나에 매핑하고 싶을 때를 위해 설계되었다고 생각합니다. 예를 들어, 저는 종종 다음과 같은 방식으로 plot ()에 대해 색상을 지정합니다.
plot(x,y, col = ifelse(x>2, 'red', 'blue'))
긴 테스트 벡터가 있지만 출력을 위해 쌍을 원했다면 sapply()
또는 plyr
‘s llply()
또는 무언가를 사용할 수 있습니다 .
답변
때때로 사용자 switch
는 ifelse
. 이 경우 :
condition <- TRUE
switch(2-condition, c(1, 2), c(3, 4))
#### [1] 1 2
(Ken Williams의 답변의 또 다른 구문 옵션입니다)
답변
다음은 Cath가 제안한 것과 유사한 접근 방식이지만 기존에 미리 할당 된 벡터와 함께 사용할 수 있습니다.
다음 get()
과 같이 사용하는 것을 기반으로합니다 .
a <- c(1,2)
b <- c(3,4)
get(ifelse(TRUE, "a", "b"))
# [1] 1 2
답변
‘if’사용, 예 :
> `if`(T,1:3,2:4)
[1] 1 2 3