簡體   English   中英

什么是R賦值運算符:= for?

[英]What is the R assignment operator := for?

通過挖掘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 "<-"

它是一個bug,還是令牌:=需要從tokenizer源代碼中刪除?

是否有一個過去的故事:= R中的運算符?

這是一個以前允許的任務操作員,請參閱2001年John Chambers的這篇文章

現在,R的開發版本允許使用=運算符將某些賦值寫為C-或Java-樣式。 這增加了與S-Plus(以及C,Java和許多其他語言)的兼容性。

所有先前允許的賦值運算符(< - ,:=,_和<< - )保持完全有效。

似乎:=函數不再存在,但您可以“重新啟用它”,如下所示:

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

為了澄清, R賦值運算符是<-=

要獲取有關它們的信息,請鍵入

 ?`<-` 

而不是<-在您的命令行中。 還存在運算符<<-影響父環境中的變量。

關於:= ,此運算符是data.table包中的j運算符。 它可以被defined as只讀defined as並且只能在data.table對象中使用。 為了說明這一點,當第一個col中的值等於1時,我們將第二列修改為b (使用值b定義col2 ):

library(data.table)

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

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

詳細說明:

?`:=`

希望它澄清一下。

(注意:這不是原始問題的直接答案。由於我沒有足夠的聲譽來評論,我認為下面的信息是有用的,我還是把它作為答案。如果有的話請告訴我。這是一個更好的方法!)

雖然您不能直接使用:= 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

在上面的例子中,在my_mutate函數中用=替換:= =將不起作用,因為!! mean_name = mean(!! expr) !! mean_name = mean(!! expr)無效R代碼。

您可以在此處閱讀有關NSE和使用dplyr編程的更多信息。 在使用dplyr函數編寫自己的函數時,它可以很好地解釋如何處理NSE。 我上面的例子直接從網站上復制過來。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM