如果要创建自己的中缀函数,它需要具有%fun_name%
的形式。为什么tidyverse
的:=
不是这样?此外,与运算符!!
相同,也形成tidyverse
。
这些运算符不是函数。只有当作为参数的一部分提供给使用非标准求值并知道如何处理它们的函数时,它们才有意义。R解释器不将这些运算符视为函数,您不能直接调用它们。如果您在准引号参数之外调用!!something
,解释器会将其视为:
!(!(something))
如果在准引号参数之外调用:=
,则会得到一个异常。
顺便说一句,您总是可以重载基中缀函数或为它们定义新的S3方法,而不需要%
。解释器总是将这些符号视为中缀函数,并且它们不是保留的。例如:
> `+` <- function(x,y) x - y
> 1 + 2
[1] -1
`/.foo` <- function(x, y) x * y
> my_object <- structure(1, class = "foo")
> 1 / 2
[1] 0.5
> my_object / 2
[1] 2
attr(,"class")
[1] "foo"
由于某些原因,R确实允许定义函数:=
,并将所得函数求值为中缀函数。然而,这并不是rlang
或data.table
实际实现:=
的方式。以:
开始的其他符号,例如:+
,或以=
结束的其他符号(例如!=
(不被解释为中缀函数;我不知道为什么会出现这种情况,因为符号:=
没有在基R中使用。解释器将其评估为中缀函数的独特能力是出乎意料的,至少对我来说是这样
> `:=` <- function(x,y) x - y
> 5 := 2
[1] 3