问题
I have come across the popular data.table
package and one thing in particular intrigued me. It has an in-place assignment operator
:=
This is not defined in base R. In fact if you didn't load the data.table
package, it would have raised an error if you had tried to used it (e.g., a := 2
) with the message:
Error: could not find function
":="
Also, why does :=
work? Why does R let you define :=
as infix operator while every other infix function has to be surrounded by %%
, e.g.
`:=` <- function(a, b) {
paste(a,b)
}
"abc" := "def"
Clearly it's not meant to be an alternative syntax to %function.name%
for defining infix functions. Is data.table
exploiting some parsing quirks of R? Is it a hack? Will it be "patched" in the future?
回答1:
It is something that the base R parser recognizes and seems to parse as a left assign (at least in terms or order of operations and such). See the C source code for more details.
as.list(parse(text="a:=3")[[1]])
# [[1]]
# `:=`
#
# [[2]]
# a
#
# [[3]]
# [1] 3
As far as I can tell it's undocumented (as far as base R is concerned). But it is a function/operator you can change the behavior of
`:=`<-function(a,b) {a+b}
3 := 7
# [1] 10
As you can see there really isn't anything special about the ":" part itself. It just happens to be the start of a compound token.
回答2:
It's not just a colon operator but rather :=
is a single operator formed by the colon and equal sign (just as the combination of "<" and "-" forms the assignment operator in base R). The :=
operator is an infix function that is defined to be part of the evaluation of the "j" argument inside the [.data.table
function. It creates or assigns a value to a column designated by its LHS argument using the result of evaluating its RHS.
来源:https://stackoverflow.com/questions/26269423/why-is-allowed-as-an-infix-operator