如何使用 '。'在 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).
我无法确定如何在 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).