如何使用 '。'在 magrittr 中用数值公式

How to use '.' in magrittr with numerical formulas

我无法确定如何在 magrittr 中使用(某些?)数值公式。这是一个特殊情况:

library(magrittr)
y = c( complex(1, 1.0,2.0), complex(1, 3.0,4.0))
ymagn = y %>% sqrt(Re(.)**2 + Im(.)**2)

这导致

  Error in sqrt(., Re(.)^2 + Im(.)^2) :    2 arguments passed to 'sqrt'
  which requires 1

magrittr http://www.win-vector.com/blog/2018/04/magrittr-and-wrapr-pipes-in-r-an-examination/ 上的此博客也 "introduces" wrapr(即 的新博客)- 描述问题清楚:

将其应用于原始代码片段:

library(wrapr)
y = c( complex(1, 1.0,2.0), complex(1, 3.0,4.0))
ymagn = y %.>% sqrt(Re(.)**2 + Im(.)**2)
ymagn

[1] 2.236068 5.000000

所以wrapr是我的新朋友。

这是您可以使用的一种方法:

ymagn = y %>% {sqrt(Re(.)**2 + Im(.)**2)}
[1] 2.236068 5.000000

您的版本不起作用的原因是默认情况下 %>% 运算符提供左侧 (LHS) 的输出作为右侧 (RHS) 的第一个参数。

在默认情况下,如果您再次提供 . 除了 将其作为第一个参数提供外,管道运算符将提供输出来代替.。正如您在 help(`%>%`,"magrittr") 中所读到的,包作者希望您以这种方式使用此功能:

iris %>% subset(., 1:nrow(.) %% 2 == 0)

如果没有括号,您尝试的代码将以这种方式求值:

ymagn = y %>% sqrt(.,Re(.)**2 + Im(.)**2)

这解释了错误报告2个参数。


使用括号称为lambda表达式。来自 help(`%>%`,"magrittr"):

Using lambda expressions with %>%

Each rhs is essentially a one-expression body of a unary function. Therefore defining lambdas in magrittr is very natural, and as the definitions of regular functions: if more than a single expression is needed one encloses the body in a pair of braces, { rhs }. However, note that within braces there are no "first-argument rule": it will be exactly like writing a unary function where the argument name is "." (the dot).