什么是R赋值运算符:= for?

时间:2015-09-28 07:31:45

标签: r data.table deprecated assignment-operator colon-equals

通过挖掘R源代码(文件R-3.2.2/src/main/gram.y28362852),我发现R解析器/标记器认为:=LEFT_ASSIGNMENT令牌。

但是当试图在R.3.2.2中使用它作为赋值运算符时, 我有一个错误(找不到:=的功能...)但是你可以看到R认为它是<-之类的作业:

> myVar := 42
Erreur : impossible de trouver la fonction ":="
> :=
Erreur : unexpected assignment in ":="
> <-
Erreur : unexpected assignment in "<-"

这是一个错误,还是需要从tokenizer源代码中删除令牌:=

R中是否有关于:=运算符的过去故事?

3 个答案:

答案 0 :(得分:14)

这是以前允许的赋值运算符,请参阅2001年John Chambers的this article

  

R的开发版现在允许编写一些作业   C-或Java-风格,使用=运算符。这增加了兼容性   使用S-Plus(以及C,Java和许多其他语言)。

     

所有以前允许的赋值运算符(&lt; - ,:=,_和_&lt;&lt ;-)   保持完全有效。

似乎:=功能不再存在,但您可以重新启用它&#34;像这样:

`:=` <- `<-`
x:=3
x
[1] 3

答案 1 :(得分:6)

为了澄清,=作业运算符为 ?`<-` <-

要获取有关他们的信息,请输入:

<<-

而不是命令行中的:=。还存在影响父环境中变量的运算符j

关于data.table,此运算符是defined as包中的data.table运算符。它可以被读取b并且只能在col2对象中使用。为了说明这一点,当第一列中的值等于b时,我们将第二列修改为1(使用值library(data.table) dt = data.table(col1=c(1,2,1,2,3), col2 = letters[1:5]) dt[col1==1,col2:='b'] 定义?`:=` ):

if (window.innerWidth > 500) {
   alert('above 500');   
} else {
   alert('below or equal to 500');   
}

详细说明:

{{1}}

希望它澄清。

答案 2 :(得分:1)

(注意:这不是对原始问题的直接回答。由于我没有足够的声誉来评论,我认为下面的信息很有用,我还是把它作为答案。请让我知道如果有更好的方法可以这样做!)

虽然您无法直接将:=用作=<-,但:=运算符在使用非标准的域特定语言(DSL)进行编程时非常有用评估(NSE),例如dplyrdata.table。以下是一个例子:

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

在上面的示例中,将:=函数中的my_mutate替换为=将无效,因为!! mean_name = mean(!! expr)无效R代码。

您可以使用dplyr here详细了解NSE和编程。在使用dplyr函数编写自己的函数时,它解释了如何处理NSE。我上面的例子直接从网站上复制过来。