使用 R |> 管道连接算术运算符。

4
这基本上是与 使用%>%管道在dplyr中链接算术运算符 相同的问题,但更新为新的(R 4.1)管道操作符 |>如何使用 R 原生管道 |> 链接算术运算符? 使用 dplyr/magrittr,您可以使用反引号进行算术运算,但在内置的 R 管道运算符中无效。以下是一个简单的示例:
R.version$version.string
# [1] "R version 4.2.2 (2022-10-31 ucrt)"

x <- 2
# With dplyr/magrittr, you can use backticks for arithmetic operators
x %>% `+`(2)
# [1] 4

# But that doesn't work with the inbuilt R pipe operator
x |> `+`(2)
#  Error: function '+' not supported in RHS call of a pipe

希望答案足够通用,适用于任何运算符或内置函数,这些运算符或内置函数通常无法与本地R管道(我的版本是R 4.2.2)良好地配合使用。
答案https://dev59.com/pFEG5IYBdhLWcg3wVqz9#72086492提供了许多有关%>% |>之间差异的有用信息,但没有一个完全回答了我的问题。

1
已经尝试过x |> base::\+`(2)`了吗? - jay.sf
@jay.sf 太棒了,这个方法有效,只需在 + 运算符周围使用反引号即可。(在此处很难复制粘贴,因为它会一直解释反引号。)你能否将其作为答案发布? - Tripartio
1
@jay.sf你的回答应该是一个答案!为什么使用base::很重要。 - TarJae
2
x |> (\+`)(2)` 也应该可以工作。 - Martin Gal
@MartinGal 这个很好用,而且非常简洁。你能否把它发布为一个答案呢? - Tripartio
3个回答

5

我们可以使用命名空间前缀。

2 |> base::`+`(2)
# 4

2

还有两种可能性,已经在https://dev59.com/pFEG5IYBdhLWcg3wVqz9#72086492中提到:

  1. 使用括号:
2 |> (`+`)(3)
#> [1] 5
  1. 使用占位符_和二元运算符的命名参数:
2 |> `+`(lhs = _, 3)
#> [1] 5

注意:+ 或者 %*% 的情况下,参数的具体命名似乎并不重要。我想这可以推广到所有二元运算符上(使用 R版本4.2.1)。

2 |> `+`(foo = _, 3)
#> [1] 5
2 |> `+`(bar = _, 3)
#> [1] 5
2 |> `+`(lhs = _, 3)
#> [1] 5
2 |> `+`(rhs = _, 3)
#> [1] 5

c(1, 3) %*% t(c(1, 4))
c(1, 3) |> `%*%`(foo = _, t(c(1, 4)))
c(1, 3) |> `%*%`(bar = _, t(c(1, 4)))
c(1, 3) |> (`%*%`)(t(c(1, 4)))
# they all return
#>      [,1] [,2]
#> [1,]    1    4
#> [2,]    3   12

当然,这两个变体并不相同:
c(1, 3) |> `%*%`(foo = _, t(c(1, 4)))
#>      [,1] [,2]
#> [1,]    1    4
#> [2,]    3   12

c(1, 3) |> `%*%`(t(c(1, 4)), foo = _)
#>      [,1]
#> [1,]   13

括号版本是我目前看到的最好的选择。谢谢! - Tripartio

1

一个解决方法(虽然不是直接的答案)是使用匿名函数来实现所需的运算符:

((x + 2) * 3) / 4
#[1] 3

# Chained with anonymous functions
x |> 
  {\(x, y) x + y}(2) |> 
  {\(x, y) x * y}(3) |> 
  {\(x, y) x / y}(4)
# [1] 3

虽然不及 magrittr 的管道操作符那般优雅

x %>%
  `+`(2) %>%
  `*`(3) %>%
  `/`(4)
# [1] 3

这个解决方法至少允许链接。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接