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
이것은 내 급여보다 높은 디자인 선택입니까?
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 (TRUE) c(1,2) else c(3,4)
.
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
" Warning in if (req(inputval) == "All") { : the condition has length > 1 and only the first element will be used"
이 경고를 제거하려면 어떻게해야합니까?
req(inputval)
는 더 많은 요소가 있음을 나타냅니다 . 단일 값을 얻으려면 함수 any()
또는 all()
유용 할 수 있습니다.
내부에 결과를 할당하면 문제를 피할 수 있습니다 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()
을위한 제어 흐름 대신 벡터화 된 함수 를 오용하는 것을 장려 if ... else ...
합니다. 조건이 하나 인 경우 TRUE
또는 FALSE
값을, 나는 쓰는 것을 선호 a <- if (TRUE) c(1,2) else c(3,4)
또는if (TRUE) a <- c(1,2) else a <- c(3,4)
ifelse
대신 사용할 때 성능 차이가 없다고 생각하지만 if
... else
단일 조건의 경우 실제로 문제 ifelse
가 될 수 있으며 일부 경우 코드 내부에서 선호 될 수 있습니다 (여기에서 간단한 추측), 동의하지 않을 수 있습니다 ;-). 나는 단지 ifelse
.
everydropr 에서 발견 :
ifelse(rep(TRUE, length(c(1,2))), c(1,2),c(3,4))
#>[1] 1 2
조건의 결과를 복제하여 원하는 길이를 반환 할 수 있습니다.