了解 Magrittr 管道 `%>%` 语法的正确使用

Pål*_*tan 1 r pipe operator-precedence magrittr

我有一个命名的数字向量,我试图将每个元素除以所有元素的总和。然后我想使用该signif函数四舍五入到有效数字。通过计算除法并存储变量,然后使用存储的变量来计算有效数字,“老派”的做法很容易。magrittr但是,如果我尝试使用管道运算符 ( )直接通过管道进行计算%>%signif则不会真正对向量执行任何操作。

我试图理解其中的区别,因为我经常遇到管道与基本 R 函数结合使用的问题。

这是一个示例,我得到的输出:

> # My named vector
> v <-setNames(c(1:5), letters[1:5])

> # Dividing each element by the total sum and rounding to significant figures
> a <- v/sum(v)
> a <- signif(a, digits = 3)

> # Dividing each element by the total sum and piping directly to signif()
> b <- v/sum(v) %>% signif(digits = 3)

> a
> b

a: 0.0667   b 0.133   c 0.2   d 0.267   e 0.333

a: 0.0666666666666667 b: 0.133333333333333 c: 0.2 d: 0.266666666666667 e: 0.333333333333333

Run Code Online (Sandbox Code Playgroud)

Ben*_*ker 5

按照@akrun的提示:?Syntax

\n
  \xe2\x80\x98%any% |>\xe2\x80\x99         special operators (including \xe2\x80\x98%%\xe2\x80\x99 and \xe2\x80\x98%/%\xe2\x80\x99) \n       \xe2\x80\x98* /\xe2\x80\x99              multiply, divide         \n
Run Code Online (Sandbox Code Playgroud)\n

显示管道运算符的优先级高于/,因此您的表达式有效

\n
  \xe2\x80\x98%any% |>\xe2\x80\x99         special operators (including \xe2\x80\x98%%\xe2\x80\x99 and \xe2\x80\x98%/%\xe2\x80\x99) \n       \xe2\x80\x98* /\xe2\x80\x99              multiply, divide         \n
Run Code Online (Sandbox Code Playgroud)\n

添加括号会有所帮助:尝试

\n
v/(sum(v) %>% signif(digits = 3))\n
Run Code Online (Sandbox Code Playgroud)\n