Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 为什么:=允许作为中缀运算符?_R_Data.table_Colon Equals - Fatal编程技术网

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))
表示不同的意思。对那些没有解释他们的担忧的下层选民来说。这个答案是为了回答最初的问题而写的。你可以通过点击“编辑…”链接查看其原始标题和内容。