Подтвердить что ты не робот

Что такое оператор назначения R: = для?

Покопавшись в исходный код R (файл R-3.2.2/src/main/gram.y lines 2836 to 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 "<-"

Это ошибка, или нужно удалить токен := из исходного кода токенизатора?

Есть ли история о := в R?

4b9b3361

Ответ 1

Это был ранее разрешенный оператор присваивания, см. эту статью от Джона Чамберса в 2001 году.

Теперь версия разработки R позволяет записывать некоторые задания C- или Java-стиль, используя оператор =. Это повышает совместимость с S-Plus (а также с C, Java и многими другими языками).

Все ранее разрешенные операторы присваивания (< -,: =, _ и <-) остаются в силе.

Кажется, функция := больше не присутствует, но вы можете "повторно включить ее" следующим образом:

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

Ответ 2

Чтобы уточнить, операторы присваивания R: <- и =.

Чтобы получить информацию о них, введите:

 ?`<-` 

Вместо <- в командной строке. Существует также оператор <<-, влияющий на переменную в родительской среде.

Что касается :=, этот оператор является оператором 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']

Подробное объяснение:

?`:=`

Надеюсь, он уточнит.

Ответ 3

(Примечание: это не прямой ответ на исходный вопрос. Поскольку у меня недостаточно репутации, чтобы комментировать, и я думаю, что приведенная ниже информация полезна, я все равно поставлю ее в качестве ответа. Пожалуйста, дайте мне знать, если есть лучший способ сделать это!)

Хотя вы не можете напрямую использовать := as = или <-, оператор := очень полезен при программировании на предметно-ориентированном языке (DSL), который использует нестандартную оценку (NSE), такую как dplyr и 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) !! mean_name = mean(!! expr) не является допустимым R-кодом.

Вы можете прочитать больше о NSE и программировании с помощью dplyr здесь. Он отлично объясняет, как обрабатывать NSE при использовании функций dplyr для написания своей собственной функции. Мой пример выше скопирован прямо с сайта.