为什么tidyverse的infix函数:=不需要它附近的%?

问题描述

如果要创建自己的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确实允许定义函数:=,并且会将结果函数评估为中缀函数。但是,这不是rlangdata.table实际实现:=的方式。以:开头的其他符号,例如:+,或以=结尾,例如!=,不解释为中缀函数;我不确定为什么会这样,因为在基数R中没有使用符号:=。解释器将其评估为中缀函数的独特能力是意料之外的,至少对我而言是不可预期的。


> `:=` <- function(x,y) x - y

> 5 := 2

[1] 3

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...