programing

왜 R의 ifelse 문은 벡터를 반환할 수 없습니까?

magicmemo 2023. 6. 10. 08:44
반응형

왜 R의 ifelse 문은 벡터를 반환할 수 없습니까?

저는 가끔 R의 생전 진술이 꽤 유용하다는 것을 알게 되었습니다.예:

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대신 진술ifelseR 단위로,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

예를 들어 if를 사용합니다.

> `if`(T,1:3,2:4)
[1] 1 2 3

네, ifelse()는 테스트의 긴 벡터가 크고 두 가지 옵션 중 하나에 각각 매핑하고 싶을 때를 위해 설계되었다고 생각합니다.예를 들어 다음과 같은 방법으로 플롯()에 대한 색상을 자주 수행합니다.

plot(x,y, col = ifelse(x>2,  'red', 'blue'))

검정의 긴 벡터가 크지만 출력을 위한 쌍을 원하는 경우 다음을 사용할 수 있습니다.sapply()또는plyrllply()아니면 뭔가, 아마도.

때때로 사용자가 필요로 하는 것은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_else부터dplyr도움이 되었을 것입니다.if_else보다 더 엄격합니다.ifelse다음과 같은 오류가 발생합니다.

library(dplyr)
if_else(TRUE,c(1,2),c(3,4))
#> `true` must be length 1 (length of `condition`), not 2

모든 드롭다운 목록에서 찾을 수 있습니다.

ifelse(rep(TRUE, length(c(1,2))), c(1,2),c(3,4))
#>[1] 1 2

조건의 결과를 복제하여 원하는 길이를 반환할 수 있습니다.

언급URL : https://stackoverflow.com/questions/1335830/why-cant-rs-ifelse-statements-return-vectors

반응형