三等号 R

triple equal sign R

提问人:Marco De Virgilis 提问时间:3/4/2020 更新时间:3/4/2020 访问量:805

问:

我正在尝试创建一个检查严格相等的函数,我想使用三等号。一些背景:

> 3 == '3'
[1] TRUE
> FALSE == 0
[1] TRUE

上述所有检查都会返回,因为输入被强制为通用类型。但是,我想检查严格的平等性。该功能完全符合我的需求。TRUEidentical

> identical(3,'3')
[1] FALSE
> identical(FALSE, 0)
[1] FALSE

现在我想以一种更简洁、更不冗长的方式实现这一点。与 Javascript 一样,我想使用三等号。我写了这个函数:

`===` <- function(a,b){
  identical(a,b)
}

但是,这不符合预期:

> 3 === 3
Error: unexpected '=' in "3 ==="

我错过了什么? 谢谢

R 函数 符号 相等

评论

1赞 mkrieger1 3/4/2020
我对 R 一无所知,但我猜它的语法不允许运算符?===
1赞 MrFlick 3/4/2020
如果你想创建自己的中缀相等运算符,你需要像 Maurits 指出的那样使用。R 分词器/分析器不会识别语言规范中未另行定义的符号。%%
0赞 Maurits Evers 3/4/2020
@MrFlick 不知何故设法定义了 ;我记得在某个时间点读到过这个,但不记得任何细节。你知道如何在没有 s 的情况下定义一个新的 infix(-like?) 运算符吗?data.table:=data.table%
1赞 MrFlick 3/4/2020
@MauritsEvers 这并不完全正确。 只是碰巧已经在解析器中定义了(计划使用但从未获得默认定义的剩余运算符)。如果他们想使用其他任何东西,比如或那是不可能的。他们只是“幸运”地知道,解析器会识别出一个剩余的运算符。如果不更改 R 本身的源代码,就无法创建自己的源代码。:=~=@=
1赞 MrFlick 3/4/2020
相关关系 : stackoverflow.com/questions/26269423/...:=

答:

6赞 Maurits Evers 3/4/2020 #1

您可以定义一个中缀运算符(用 in 表示“equal”;-):e%e%

`%e%` <- function(a, b) identical(a, b)
3 %e% 3
#[1] TRUE

或者,如果您想要三等号

`%===%` <- function(a, b) identical(a, b)
3 %===% 3
#[1] TRUE

或者一个带有向量的例子

1:3 %===% 1:3
#[1] TRUE

这些中缀操作(在操作数之间使用运算符)也可以写成

`%===%`(1:3, 1:3) 

以与写作相同的方式

`==`(3, 3)

评论

0赞 Marco De Virgilis 3/4/2020
我知道我可以使用百分号,但这有点违背了快速输入它的目的。至少在我的键盘上是 shift + 5。我知道我可以重新映射键盘,但在这一点上这有点矫枉过正。有没有办法只使用等号?
1赞 Maurits Evers 3/4/2020
@MarcoDeVirgilis我明白了。不,我认为在使用自定义中缀运算符时无法避免这些符号。如果将其定义为至少,则将具有与%%e%===;-)
2赞 Maurits Evers 3/4/2020
@MarcoDeVirgilis 在更广泛的上下文中可能很有趣:为什么选择 % 作为运算符分隔符