问题描述
如果要创建自己的infix函数,则其格式必须为StartupEventArgs.Args
。为什么%fun_name%
中的:=
不是这种情况?另外,与运算符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