2017-12-18 22 views
1

:평가 dplyr의 :: case_when()

x <- 1:50 
case_when(x %% 35 == 0 ~ "fizz buzz", 
      x %% 5 == 0 ~ "fizz", 
      x %% 7 == 0 ~ "buzz", 
      TRUE ~ as.character(x)) 

내가 수 35"buzz"을 생산할 것으로 기대하지만 "fizz buzz"

내 추론을 생산하고 그 case_when()들을 평가입니다 이전 문장이 참인지 아닌지에 관계없이 모든 문장을 하나씩 (마지막 문장 인 TRUE ~ as.character(x)을 평가하므로) 35 %% 7이 분명히 0입니다.

무엇이 누락 되었습니까?

+4

명령문은 순서대로 평가되고 첫 번째 명령문과 일치하는 것이 첫 번째 결과를 얻고 나중에 결과로 대체되지 않습니다. – Marius

+0

나는 왜이 마지막 문장 TRUE ~ as.character (x)가 평가되는지 왜 의아해하고있다. – tictocchoc

+2

35, 5 또는 7로 나눌 수없는'x '값이 있습니다 - 그래서 처음 3 문장이 처리 된 후에도 여전히 처리 할 값이 남아 있습니다. 당신이 아직도 혼란 스러우면 다른 일이 일어나야한다고 생각하는 이유를 더 자세하게 설명 할 수 있습니까? – Marius

답변

1

case_when() 모든 문을 하나 하나 평가에 관계없이 이전 사실인지 아닌지

이 (가 TRUE ~ as.character (x)는 마지막 인 평가 않기 때문에) 오도 ​​된 경우 case_when()의 출력은 사실 인 첫 번째 명령문을 기반으로합니다.

TRUE ~ as.character(x)은 x가 5 또는 7로 나눌 수없는 경우 x가 문자열로 반환됨을 의미합니다. 즉 x = 5 인 경우 "5"가 반환됩니다.

x가 5 또는 7로 나눌 수있는 경우 casewhen()은 후속 사례를 평가하지 않습니다. "fizz"및 "buzz"는 이 아니며 으로 전달 된이 아니며 이미 문자 열이 아니어도됩니다.

+0

'case_when'는 첫 번째 진정한 사건의 값을 취하는 것이 맞지만 실제로 후속 사례는 부작용이 있는지 알 수 있듯이 여전히 평가됩니다. 예를 들어''foo ''를 반환하지만 두 번째 경우에서도 경고 메시지가 나타납니다 :'case_when (TRUE ~ foo ", TRUE ~ warning ("bar "))' –

+0

마찬가지로'2' 하지만 그 이후에'x'는 두 번 증가했기 때문에'3'입니다 :'x <- 1; case_when (TRUE ~ (x <- x + 1), TRUE ~ (x <- x + 1))'입니다. (분명히, 실제 코드에서 이와 같은 부작용을 사용하는 것은 권장하지 않습니다. 단지 예일뿐입니다.) –

+0

@TimGoodman 고마워요. 나는 TRUE ~가 절대 평가되지 않았다고 생각한 경우에 오류를 받았지만 적절한 NA_ [class] _ 대신에 TRUE ~ NA를 설정함으로써 종종 잡혔다. 나는 점에 합류하지 않았다. – bmrn