管道操作顺序

时间:2016-07-22 16:39:19

标签: r magrittr

我的问题是magrittr包裹%>%的管道运营商按运营顺序排在哪里?

我有一个与以下问题类似的问题:

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

这导致以下非圆形数字:

           a        b         c
1 -0.0121966 0.119878 0.8922125

要获得舍入的数字,我需要将df/rowSums(df)放在括号之间。

我使用+-*/^进行了实验,结果我发现操作顺序如下:

  1. Exponents
  2. 管道
  3. 乘法和除法
  4. 加法和减法
  5. 这是对的还是我对管道操作员的理解有问题?

1 个答案:

答案 0 :(得分:9)

您要查找的帮助页面是?Syntax。 (不要因为找不到这个而感觉不好,我在搜索关键字上花了六个猜测。)我将在这里引用它的整个运算符优先级表:

  

定义了以下一元和二元运算符。他们是     列出在优先级组中,从最高到最低。

   ‘:: :::’           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的管道运算符,如 all 形式为%whatever%的运算符,确实具有大于乘法和除法但优于取幂的优先级,并且这是有保证的按语言规范。

就个人而言,我没有看到这些运营商的价值。为什么不写

round(df/rowSums(df), 3)

哪个具有您想要的评估顺序,并且(IMNSHO)也更容易阅读?