【问题标题】:Why is := allowed as an infix operator?为什么 := 允许作为中缀运算符?
【发布时间】:2014-12-03 20:27:45
【问题描述】:

我遇到了流行的data.table 包,其中一件事特别让我感兴趣。它有一个就地赋值运算符

:=

这在基础 R 中没有定义。事实上,如果您没有加载 data.table 包,如果您尝试使用它(例如,a := 2)会引发错误并显示以下消息:

错误:找不到函数":="

另外,为什么:= 有效?为什么 R 允许您将 := 定义为中缀运算符,而其他所有中缀函数都必须被 %% 包围,例如

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

"abc" := "def"

显然,它并不是%function.name% 用于定义中缀函数的替代语法。 data.table 是否在利用 R 的一些解析怪癖?是黑客吗?以后会“打补丁”吗?

【问题讨论】:

  • 请查看 data.table 文档,可能从常见问题解答开始。
  • @DirkEddelbuettel。我了解它在 data.table 中的使用方式。但是 R 允许定义这样的运算符并且不会导致语法错误这一事实让我很感兴趣。这是关于 R 以及它如何解析代码的基本问题。
  • AFAIK 它是本地的 data.table 并且仅适用于 [ 子集。所以你的问题是偏离基础的(不是 R 怪癖),这就是为什么我把你送到 data.table 文档讨论这个
  • @DirkEddelbuettel 我认为你没有理解我的意思。我可以使用:=
  • This Q&A 来自 Matt 在这里可能也非常相关。

标签: r data.table colon-equals


【解决方案1】:

它不仅仅是一个冒号运算符,而是:= 是一个由冒号和等号组成的单个运算符(就像“:= 运算符是一个中缀函数,它被定义为 [.data.table 函数内的“j”参数求值的一部分。它使用评估其 RHS 的结果为由其 LHS 参数指定的列创建或分配一个值。

【讨论】:

  • 致那些没有解释他们的担忧的反对者。写这个答案是为了回答最初写的问题。您可以通过单击“已编辑 ....”链接查看其原始标题和内容。
【解决方案2】:

这是基本 R 解析器识别并似乎解析为左分配的东西(至少在操作的术语或顺序等方面)。有关详细信息,请参阅C source code

as.list(parse(text="a:=3")[[1]])
# [[1]]
# `:=`
# 
# [[2]]
# a
# 
# [[3]]
# [1] 3

据我所知,它是无证的(就基本 R 而言)。但它是一个可以改变其行为的函数/运算符

`:=`<-function(a,b) {a+b}
3 := 7
# [1] 10

如您所见,“:”部分本身并没有什么特别之处。它恰好是复合标记的开始。

【讨论】:

  • @BondedDust 但data.table拥有该功能。他们确实依赖于他们无法控制的解析器中的某些东西。如果他们愿意,另一个包可以重新定义c。这基本上就是他们正在做的事情(:= 恰好没有默认实现)
  • OP 确实提到了 data.table 包,所以我认为在该设置中 := 由 data.table “拥有”。如果您认为 period-function ( .() ) 具有 bquote 和 plyr 函数的单独(本地化)“所有权”,我想我会同意您的观点。在我看来,重新定义 c() 也是一个非常糟糕的主意。
  • @BondedDust 但是假设data.table 想将~= 定义为新的中缀运算符。他们不能这样做,因为解析器无法识别它(即parse(text="a~=3") 会产生错误)。 := 的“特殊性”完全独立于 data.table 包。这是自定义中缀运算符需要 % 的规则的一个很大的例外,这似乎是我阅读时 OP 问题的精神。
  • 我猜在某个时候 R Core 正在考虑实现:= 作为&lt;- 的替代方案,因为某些语言将其用作assignment operator,但随后在解析器之后放弃了这个想法写好了。
  • @MichaelChirico 基本可以看懂解析器代码。对于优秀的运营商来说,看起来没有任何其他的低挂。我的意思是,您可以查看rlang 如何选择更改!!!!! 的含义,尽管它们并未被解析为单个运算符。您可以重新使用 (( a )) 之类的内容来表示不同的含义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-16
  • 2018-05-17
  • 2012-10-30
  • 1970-01-01
  • 2011-09-04
  • 2017-05-09
相关资源
最近更新 更多