R >4.1 语法:错误:管道的 RHS 调用不支持函数“function”

问题描述 投票:0回答:3

R 4.1.0 著名地介绍了

|>
(“基管”)运算符和类似 Haskell 的 lambda 函数语法。

我认为可以将两者结合起来:

c(1, 2, 3) |> \(x) 2 * x

这对我来说失败了:

错误:管道的 RHS 调用不支持函数“function”

因此我认为这不是有效的语法?这有效:

c(1, 2, 3) |> (\(x) 2 * x)()

是否有更优雅的方式来链接管道和新的 lambda 函数?

r syntax
3个回答
21
投票

我认为最优雅的方式是使用花括号:

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))()

12
投票

这就是原生管道的局限性。您只需在函数名称后包含 () 即可,这与 magrittr 不同。

# native pipe
foo |> bar()
# magrittr pipe
foo %>% bar

也就是说,

\(x) 2*x
相当于旧的匿名函数语法
function (x) 2*x
,但与命名函数类似, 当在本地管道的 RHS 上使用时,必须包含 ()。


0
投票

另一种合理的方法是:

c(1, 2, 3) |> sapply(\(x) 2 * x)
© www.soinside.com 2019 - 2024. All rights reserved.