2017-12-18 18 views
1

dplyr::case_when()ドキュメントに与えられた例を次に示します。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()評価さで生成以前のものが真であるかどうかにかかわらず、すべてのステートメントは1つずつ(最後のものである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"はではなくas.character(x)に、は渡されていません。すでに文字列である必要はありません。

+0

'case_when'は最初の真のケースの値を取るが、副作用があると分かるように、後続のケースはまだ評価されているというのは正しいです。例えば、 '' foo''を返しますが、 '' case_when(TRUE〜foo ''、TRUE〜warning( "bar")) ' –

+0

のように、 'x 'は2回インクリメントされたので' 3 'です。 case_when(TRUE〜(x < - x + 1)、TRUE〜(x < - x + 1)) 'です。 (明らかに、私はこのような副作用を実際のコードで使用することを推奨していません。それは単なる例です)。 –

+0

@TimGoodmanこれは良い点です。 TRUE〜が決して評価されなかったと思われる場合にエラーを受け取ったにもかかわらず、適切なNA_ [class] _の代わりにTRUE〜NAを設定することによって、私はしばしばキャッチされます。 – bmrn