R 4.1.0 著名地介绍了
|>
(“基管”)运算符和类似 Haskell 的 lambda 函数语法。
我认为可以将两者结合起来:
c(1, 2, 3) |> \(x) 2 * x
这对我来说失败了:
错误:管道的 RHS 调用不支持函数“function”
因此我认为这不是有效的语法?这有效:
c(1, 2, 3) |> (\(x) 2 * x)()
是否有更优雅的方式来链接管道和新的 lambda 函数?
我认为最优雅的方式是使用花括号:
c(1, 2, 3) |> {\(x) 2 * x}()
但这也有效:
c(1, 2, 3) |> (\(x) 2 * x)()
?`|>`
推荐后者:
# or use an anonymous function:
mtcars |> subset(cyl == 4) |> (function(d) lm(mpg ~ disp, data = d))()
mtcars |> subset(cyl == 4) |> (\(d) lm(mpg ~ disp, data = d))()
这就是原生管道的局限性。您只需在函数名称后包含 () 即可,这与 magrittr 不同。
# native pipe
foo |> bar()
# magrittr pipe
foo %>% bar
也就是说,
\(x) 2*x
相当于旧的匿名函数语法function (x) 2*x
,但与命名函数类似,
当在本地管道的 RHS 上使用时,必须包含 ()。
另一种合理的方法是:
c(1, 2, 3) |> sapply(\(x) 2 * x)