[r] R의 ifelse 문이 벡터를 반환 할 수없는 이유는 무엇입니까?

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에서 선택한 요소로 채워진 동일한 모양의 값을 반환합니다 .yesnotestTRUEFALSE

길이 1의 테스트 값을 통과하므로 길이 1의 결과를 얻게됩니다. 더 긴 테스트 벡터를 통과하면 더 긴 결과를 얻을 수 있습니다.

> ifelse(c(TRUE, FALSE), c(1, 2), c(3, 4))
[1] 1 4

따라서 ifelse부울 벡터를 테스트하고 (벡터) yesno인수 에서 가져온 요소로 채워진 동일한 길이의 벡터를 반환하는 특정 목적을위한 것입니다 .

함수의 이름으로 인해 실제로 정상적인 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()또는 무언가를 사용할 수 있습니다 .


답변

때때로 사용자 switchifelse. 이 경우 :

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