6

%>%と組み合わせると、非常に驚​​くべき出力が生成される状況に遭遇しました!。次のコードを検討してください。

x <- c(1:20)
y <- !is.na(x)

> y
 [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 
     TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE

> sum(Y)
[1] 20

わかりました、驚くべきことは何もありません。%>%しかし、奇妙なことを使用して短縮しようとすると、次のことが起こります。

!is.na(x) %>% sum

[1] TRUE

TRUE?? 私が期待したものではありません-そうあるべきです20

を削除する!と、期待どおりに表示されます0

> is.na(x) %>% sum
[1] 0

括弧を追加すると動作します:

> {!is.na(x)} %>% sum
[1] 20

関数として扱う!と次のようになります。

> is.na(x) %>% `!` %>% sum
[1] 20

ではなく!is.na(x) %>% sum、なぜそれが返されるのですか?TRUE20

編集:他の論理演算子は同様の動作を生成します:

> T&T %>% sum()
[1] TRUE
> {T&T} %>% sum()
[1] 1

> T|T %>% sum()
[1] TRUE
> {T|T} %>% sum()
[1] 1
4

3 に答える 3

6

私はそれが操作の問題の順序であると思われます:

!is.na(x) %>% sum

に評価しています

!(is.na(x) %>% sum)

これはに相当しますTRUE

于 2016-06-09T17:51:47.970 に答える
4

@C-Z_ の回答を受け入れましたが、これに関するコンテキストを提供するために別の回答を追加したいと思います。に案内してくれた @rawr に感謝し?Syntaxます。

基本的%>%には演算子と見なされる%in%ため、操作の順序に従わなければなりません。Syntaxヘルプ ページでは、ユーザーが自由に定義できるため、これは演算子 (つまり、任意の中置演算子) に対応します%any%。たまたま、これは が%>%論理演算子の前に発生し、算術演算子 (たとえば*and \) の前にも発生することを意味します。その結果、私のように単純に、チェーンの次のステップの前に の左側%>%が完了すると考えていると、驚きが得られます。例えば:

3+2 %>% '*'(4) %>% `/`(2)

しない3+2=5, 5*4= 20, 20/2=10

が よりも優先される2*4/2=4, 4+3=7ためです。%>%+

magrittr次のようなパッケージ内の関数を使用する場合:

add(3,2) %>% multiply_by(4) %>% divide_by(2) 

期待どおりに取得10します。の周りにブラケットを配置すると、3+2も得られます10

私の元の例では、 などの論理演算子は!よりも優先順位が低い%>%ため、合計が競合した後、最後に動作します。

話の教訓:%>%他のオペレーターとの混合には注意してください。

于 2016-06-09T18:30:12.457 に答える
1

magrittr パッケージの「not」エイリアスを使用することもできます。

> is.na(1:20) %>% not %>% sum

[1] 20

于 2016-06-16T08:48:07.247 に答える