无法在R中使用带有基管的特殊(`)函数
对于magrittr管道,可以使用反引号 (`)在管道链中包含特殊功能1。例如:
library(magrittr)
c(7, 6, 5) %>% sort() %>% `[`(1)
#> [1] 5
# and
3 %>% `-`(4)
#> [1] -1
是一样的
v <- c(7, 6, 5)
v <- sort(v)
v[1]
#> [1] 5
# and
3 - 4
#> [1] -1
但是,本机 R 管道|>(还?)不允许这样做。例如:
c(7, 6, 5) |> sort() |> `[`(1)
#> Error: function '[' not supported in RHS call of a pipe
# and
3 |> `-`(4)
#> Error: function '-' not supported in RHS call of a pipe
是否有没有在技术上实施的原因(以防万一,原因是什么,是否有计划改变这一点?)并且是否有任何不太曲折的解决方法?
1我不知道如何正确引用那些需要以标准函数形式调用反引号的函数(在诸如+或 之类的运算符后面[])。如果存在更合适的表达,请编辑我说“特殊功能”的地方。
回答
本机管道操作员的帮助文件|>指出:
为避免歧义,rhs 调用中的函数在语法上可能并不特殊,例如 + 或 if。
所以并不是说[ 函数没有在管道中实现,而是为了防止解析歧义,专门禁止在管道中使用该[ 符号。肯定有理由认为语法'['(op1, op2)或'-'(op1, op2)可能会让新用户感到困惑,并导致代码不那么干净和惯用。可能还有更多 - 也许在某些边缘情况下会有真正的解析歧义,但我想不出任何,只要在特殊符号周围使用反引号。
无论如何,这意味着您可以将函数定义为[(有点像 magrittr 的extract)的别名,例如:
obtain <- `[`
c(7, 6, 5) |> sort() |> obtain(1)
#> [1] 5
takeaway <- `-`
c(7, 6, 5) |> sort() |> takeaway(1)
#> [1] 4 5 6