R 为什么:=允许作为中缀运算符?
我遇到了流行的R 为什么:=允许作为中缀运算符?,r,data.table,colon-equals,R,Data.table,Colon Equals,我遇到了流行的data.table软件包,有一件事让我特别感兴趣。它有一个就地赋值运算符 := 这在base R中没有定义。事实上,如果您没有加载data.table包,如果您尝试使用它(例如a:=2),它会引发错误,并显示以下消息: 错误:找不到函数“:=” 还有,为什么:=工作?为什么R允许您将:=定义为中缀运算符,而其他所有中缀函数都必须由%%包围,例如 `:=` <- function(a, b) { paste(a,b) } "abc" := "def" `:=`基本R
data.table
软件包,有一件事让我特别感兴趣。它有一个就地赋值运算符
:=
这在base R中没有定义。事实上,如果您没有加载data.table
包,如果您尝试使用它(例如a:=2
),它会引发错误,并显示以下消息:
错误:找不到函数“:=”
还有,为什么:=
工作?为什么R允许您将:=
定义为中缀运算符,而其他所有中缀函数都必须由%%
包围,例如
`:=` <- function(a, b) {
paste(a,b)
}
"abc" := "def"
`:=`基本R解析器识别并似乎将其解析为左赋值(至少在操作的术语或顺序等方面)。有关更多详细信息,请参阅
as.list(parse(text="a:=3")[[1]])
# [[1]]
# `:=`
#
# [[2]]
# a
#
# [[3]]
# [1] 3
据我所知,它是未记录的(就BaseR而言)。但它是一个可以更改其行为的函数/运算符
`:=`<-function(a,b) {a+b}
3 := 7
# [1] 10
`:=`它不仅仅是一个冒号运算符,而是一个由冒号和等号组成的单个运算符(就像"请看一看data.table文档,可能从FAQ开始。@DirkEddelbuettel。我了解它在data.table中的用法。但事实上,R允许定义这样一个运算符,而不会导致语法错误,这让我很感兴趣。这是关于R的一个基本问题,可能是关于它如何解析代码的。AFAIK它是data.tabl的本地问题并且只适用于[
子集。所以你的问题是离题的(不是怪癖)这就是为什么我将您发送到data.table文档来讨论这个问题。@DirkEddelbuettel我想您没有领会我的意思。我可以使用Matt的:=
定义一个函数,这在这里可能也非常相关。@BondedDust但是数据。table
不拥有这个函数。他们确实依赖于语法分析器中的某个东西他们没有控制权。如果他们愿意,另一个包可以重新定义c
。这就是他们正在做的事情(只是碰巧没有:=
的默认实现)。OP确实提到了data.table包,所以我认为在该设置中:=
是“拥有的”如果你认为周期函数((
)由bquote
和plyr函数单独(本地化)“拥有”,我想我会同意你的观点。在我看来,重新定义c()
也是一个非常糟糕的主意。@BondedDust但假设data.table
想将~=
定义为新的中缀运算符。他们不能这样做,因为解析器无法识别它(即parse(text=“a~=3”)
将生成错误。“特殊性”of:=
完全独立于数据表
包。自定义中缀运算符需要%
这一规则是一个很大的例外,这似乎是OP问题的核心所在。我猜在某个时候,R Core考虑实现:=
作为@Mich的替代方案aelChirico您基本上可以阅读解析器代码。看起来没有任何其他低挂起的好操作符。我的意思是,您可以看看rlang
如何选择更改!!
和!!!
的含义,尽管它们不是作为单个操作符解析的。您可以重新使用((a))
表示不同的意思。对那些没有解释他们的担忧的下层选民来说。这个答案是为了回答最初的问题而写的。你可以通过点击“编辑…”链接查看其原始标题和内容。