2016-07-22 1 views
5

私の質問は、magrittrパッケージ%>%の配管オペレータは、どのような順序で動作しますか?配管での動作順序

私は次のようにsimmilar問題を抱えている:私はdf/rowSums(df)を配置する必要が丸みを帯びた数値を取得するには

  a  b   c 
1 -0.0121966 0.119878 0.8922125 

set.seed(10) 
df <- data.frame(a=rnorm(3),b=rnorm(3),c=rnorm(3)) 
df/rowSums(df) %>% round(.,3) 

これは、以下の非丸みを帯びた数字になりブラケットの間。

  1. 指数精度
  2. 配管
  3. 乗除算
  4. 私は+-*/^と、私は動作の順序を発見した結果から実験は以下の通りであります

  5. 加減算

配管作業者の理解が間違っていますか?

+2

'/'は関数なので、 '' rowSums(df)%>%\ '/ \'(df、。)%>%round(3) '' 'rowSums()'が最初に、その後 '/'が使われるからです。またはより簡単に言えば、* magrittr *は、divide_by(df、rowSums(df))%>%round(3) ' –

+0

' df%>% "/"(rowSums(。))%>%round(3) ' –

答えて

8

お探しのヘルプページは?Syntaxです。 (これを見つけることができないために気を悪くしないでください、それは検索キーワードで私におよそ6推測を取った。)私はここにその全体演算子の優先順位表を引用するつもりです:

次単項およびバイナリ演算子は、が定義される。優先度グループには、 が高い順にリストされています。

‘:: :::’   access variables in a namespace    
    ‘$ @’    component/slot extraction     
    ‘[ [[’    indexing          
    ‘^’    exponentiation (right to left)    
    ‘- +’    unary minus and plus       
    ‘:’    sequence operator        
    ‘%any%’   special operators (including ‘%%’ and ‘%/%’) 
    ‘* /’    multiply, divide        
    ‘+ -’    (binary) add, subtract      
    ‘< > <= >= == !=’ ordering and comparison      
    ‘!’    negation          
    ‘& &&’   and           
    ‘| ||’    or           
    ‘~’    as in formulae        
    ‘-> ->>’   rightwards assignment       
    ‘<- <<-’   assignment (right to left)     
    ‘=’    assignment (right to left)     
    ‘?’    help (unary and binary)      

のでmagrittrのパイプ演算子は、すべてのような形%whatever%の事業者は、確かに累乗よりも優先順位は乗除算より大きく低下していない、これは言語仕様によって保証されています。


個人的には、これらの演算子の値は表示されません。なぜあなたがしたい評価順序を持っており、(IMNSHO)にも読みやすい

round(df/rowSums(df), 3) 

を書きませんか?

+0

はい、パイプが素敵で便利な場合がありますが、これはその1つではありません。 – cory

+0

これは非常に便利であり、この場合、 'round(df/rowSums(df)、3)'が優れています。 – athraa

+2

パイプは、この意味でより直観的です。思考の順序に従います。行数で割り、次に丸めます。それは/ * +の後に来なければなりませんが、現時点ではオプションではありません。 – jtr13