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

Rom*_*tin 18 r assignment-operator data.table colon-equals

通过深入研究R源代码(文件R-3.2.2/src/main/gram.y2836,2852)我发现R解析器/标记器认为这:=是一个LEFT_ASSIGNMENT标记.

但是当我尝试将它用作赋值运算符时R.3.2.2,
我有一个错误(无法找到:=...的函数)但是你可以看到R认为它是一个类似的赋值<-:

> myVar := 42
Erreur : impossible de trouver la fonction ":="
> :=
Erreur : unexpected assignment in ":="
> <-
Erreur : unexpected assignment in "<-"
Run Code Online (Sandbox Code Playgroud)

它是一个bug,还是:=需要从tokenizer源代码中删除令牌?

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

Jam*_*mes 14

这是一个以前允许的任务操作员,请参阅2001年John Chambers的这篇文章.

现在,R的开发版本允许使用=运算符将某些赋值写为C-或Java-样式.这增加了与S-Plus(以及C,Java和许多其他语言)的兼容性.

所有先前允许的赋值运算符(< - ,:=,_和<< - )保持完全有效.

似乎该:=功能不再存在,但您可以"重新启用它",如下所示:

`:=` <- `<-`
x:=3
x
[1] 3
Run Code Online (Sandbox Code Playgroud)

  • 我认为他们只是忘了删除它,然后Matt出现了data.table,现在他们不能再删除它了. (4认同)

Min*_*ang 9

(注:这不是对原始问题的直接回答。由于我没有足够的声誉来发表评论,并且我认为下面的信息很有用,所以我无论如何都将其作为答案。如果有,请告诉我更好的方法来做到这一点!)

尽管不能直接使用:=as=<-,但该:=运算符在使用使用非标准评估 (NSE) 的领域特定语言 (DSL) 进行编程时非常有用,例如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
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,在函数:=内替换为不起作用,因为不是有效的 R 代码。my_mutate=!! mean_name = mean(!! expr)

您可以在dplyr 此处阅读有关 NSE 和编程的更多信息。它很好地解释了在使用dplyr函数编写自己的函数时如何处理 NSE。我上面的例子是直接从网站上复制过来的。

  • 问题:你必须从某个地方导入 `:=` 吗?我正在构建一个包,其函数的语法与上面的“my_mutate()”非常相似,并且“R CMD CHECK”给了我“没有可见的全局函数定义:=”错误。想法? (3认同)
  • 哦等等,我想我找到了答案:https://community.rstudio.com/t/undefined-global-functions-or-variables/10852/2 简短版本:`@importFrom rlang :=` (2认同)

Col*_*vel 6

为了澄清,R赋值运算符是<-=.

要获取有关它们的信息,请键入

 ?`<-` 
Run Code Online (Sandbox Code Playgroud)

而不是<-在您的命令行中.还存在<<-影响父环境中的变量的运算符.

关于:=,该运营商是j运营商data.table.它可以被读取defined as并且仅在data.table对象中可用.为了说明这一点,当第一个col中的值等于时,我们将第二列修改为b(col2使用value 定义b)1:

library(data.table)

dt = data.table(col1=c(1,2,1,2,3), col2 = letters[1:5])

dt[col1==1,col2:='b']
Run Code Online (Sandbox Code Playgroud)

详细说明:

?`:=`
Run Code Online (Sandbox Code Playgroud)

希望它澄清一下.

  • @RomainJacotin*CRAN是R本身的一个庞大的测试套件* - 对R的这种改变会导致数百个软件包失败,直接依赖+更多,这取决于间接.IMO R中未使用的`:=`运算符是一个特性,事实上甚至可能会有更少的运算符.此外,R不提供可以替代该数据的功能.表的有价值的功能,所以我不知道什么理由可以证明你提到的情况. (2认同)