22

通过深入研究 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 "<-"

它是一个错误,还是:=需要从标记器源代码中删除令牌?

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

4

3 回答 3

17

它是以前允许的赋值运算符,请参阅John Chambers 在 2001 年发表的这篇文章

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

所有以前允许的赋值运算符(<-、:=、_ 和 <<-)仍然完全有效。

:=功能似乎不再存在,但您可以像这样“重新启用它”:

`:=` <- `<-`
x:=3
x
[1] 3
于 2015-09-28T08:19:43.257 回答
9

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

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

 ?`<-` 

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

关于:=,这个运算符是包中的j运算符data.table。它可以被读取defined as并且只能在data.table对象中使用。为了说明这一点,当第一列中的值等于时,我们将第二列修改为bcol2用 value定义) :b1

library(data.table)

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

dt[col1==1, col2:='b']

详细解释:

?`:=`

希望它澄清。

于 2015-09-28T08:08:03.550 回答
5

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

尽管您不能直接使用:=as=<-,但该:=运算符在使用使用非标准评估 (NSE) 的领域特定语言 (DSL) 进行编程时非常有用,例如dplyrand data.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 您可以在此处阅读有关 NSE 和编程的更多信息。它很好地解释了在使用dplyr函数编写自己的函数时如何处理 NSE。我上面的例子是直接从网站上复制的。

于 2018-03-22T17:16:40.793 回答