管道操作顺序

sal*_*hin 7 r magrittr

我的问题是magrittr包装的管道操作员在哪里按操作%>%顺序排列?

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

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

这导致以下非圆形数字:

           a        b         c
1 -0.0121966 0.119878 0.8922125
Run Code Online (Sandbox Code Playgroud)

要获得圆形数字,我需要放在df/rowSums(df)括号之间.

我试验了+,-,*,/^从结果我发现操作的顺序如下:

  1. 指数
  2. 管道
  3. 乘法和除法
  4. 加减

这是对的还是我对管道操作员的理解有问题?

zwo*_*wol 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)                      
Run Code Online (Sandbox Code Playgroud)

所以magrittr的管道运算符,就像表单中的所有运算符一样%whatever%,确实具有大于乘法和除法的优先级,但是低于取幂,这是由语言规范保证的.


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

round(df/rowSums(df), 3)
Run Code Online (Sandbox Code Playgroud)

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

  • 在这个意义上,管道仍然更直观,它遵循思想的顺序:除以rowums然后再舍入.它应该在/*+之后 - 虽然,imho,但在这一点似乎不是一个选项. (2认同)