问题
By digging into R source code (file R-3.2.2/src/main/gram.y lines 2836 to 2852) I found that the R parser/tokenizer considers that := is a LEFT_ASSIGNMENT token.
But when trying to use it as an assignment operator in R.3.2.2,
I have an error (impossible to find function for := ...) but as you can see R considers it as an assignment like <- :
> myVar := 42
Erreur : impossible de trouver la fonction ":="
> :=
Erreur : unexpected assignment in ":="
> <-
Erreur : unexpected assignment in "<-"
Is it a bug, or does the token := need to be removed from the tokenizer source code?
Is there a past story about := operator in R?
回答1:
It was a previously allowed assignment operator, see this article from John Chambers in 2001.
The development version of R now allows some assignments to be written C- or Java-style, using the = operator. This increases compatibility with S-Plus (as well as with C, Java, and many other languages).
All the previously allowed assignment operators (<-, :=, _, and <<-) remain fully in effect.
It seems the := function is no longer present, but you can "re-enable it" like this:
`:=` <- `<-`
x:=3
x
[1] 3
回答2:
To clarify, the R assignment operators are <- and =.
To get information about them type:
?`<-`
Instead of <- in your command line. There also exists an operator <<- affecting the variable in the parent environment.
Regarding := , this operator is the j operator in data.table package. It can be read defined as and is only usable in a data.table object. To illustrate this we modify the second column to b (define col2 with value b) when values in the first col are equal to 1:
library(data.table)
dt = data.table(col1=c(1,2,1,2,3), col2 = letters[1:5])
dt[col1==1,col2:='b']
For detail explanation:
?`:=`
Hope it clarifies.
回答3:
(Note: This is not a direct answer to the original question. Since I don't have enough reputation to comment and I think the piece of information below is useful, I put it as an answer anyway. Please let me know if there is a better way to do so!)
Although you can't directly use := as = or <-, the := operator is very useful in programming with domain specific language (DSL) that use nonstandard evaluation (NSE), such as dplyr and data.table. Below is an example:
library(dplyr)
df <- tibble(
g1 = c(1, 1, 2, 2, 2),
g2 = c(1, 2, 1, 2, 1),
a = sample(5),
b = sample(5)
)
my_mutate <- function(df, expr) {
expr <- enquo(expr)
mean_name <- paste0("mean_", quo_name(expr))
sum_name <- paste0("sum_", quo_name(expr))
mutate(df,
!! mean_name := mean(!! expr),
!! sum_name := sum(!! expr)
)
}
my_mutate(df, a)
#> # A tibble: 5 x 6
#> g1 g2 a b mean_a sum_a
#> <dbl> <dbl> <int> <int> <dbl> <int>
#> 1 1. 1. 1 3 3. 15
#> 2 1. 2. 4 2 3. 15
#> 3 2. 1. 2 1 3. 15
#> 4 2. 2. 5 4 3. 15
#> # ... with 1 more row
In the example above, replacing := within the my_mutate function with = won't work, because !! mean_name = mean(!! expr) isn't valid R code.
You can read more about NSE and programming with dplyr here. It does a great job explaining how to handle NSE when using dplyr functions to write your own function. My example above is directly copied from the website.
来源:https://stackoverflow.com/questions/32817780/what-is-the-r-assignment-operator-for