【问题标题】:triple equal sign R三等号 R
【发布时间】:2020-06-16 08:23:29
【问题描述】:

我正在尝试创建一个检查严格相等的函数,并且我想使用三重等号。一些上下文:

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

上述所有检查都返回TRUE,因为输入被强制转换为通用类型。但是我想检查严格的平等。 identical 函数正是我所需要的。

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

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

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

但是这并不像预期的那样:

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

我错过了什么? 谢谢

【问题讨论】:

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

标签: r function symbols equality


【解决方案1】:

您可以定义一个中缀运算符(使用%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)

【讨论】:

  • 我知道我可以使用百分号,但这有点违背了快速输入的目的。至少在我的键盘上是 shift + 5。我知道我可以重新映射键盘,但在这一点上这将是一个矫枉过正。有没有办法只使用等号?
  • @MarcoDeVirgilis 我明白了。不,我认为您在使用自定义中缀运算符时无法避免 % 符号。如果您将其定义为%e%,至少您将拥有与=== 相同数量的键;-)
  • @MarcoDeVirgilis 也许在更广泛的背景下很有趣:Why was % chosen as the operator delimiter
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-25
  • 2012-06-29
  • 1970-01-01
  • 2011-12-24
  • 2020-07-25
相关资源
最近更新 更多