Мои ученики часто видят ошибку в использовании задания <-
внутри dplyr
функций. В результате имя столбца будет вызовом присваивания.
library(dplyr)
iris |>
summarise(avg_petal_length <- mean(Petal.Length))
#> avg_petal_length <- mean(Petal.Length)
#> 1 3.758
Я считаю, что такое поведение связано с использованием присваивания в базовой нотации присвоения доллара R.
iris$petal_length_one <- iris$petal_length + 1
Как мне объяснить такое поведение своим ученикам?
Логика того, как это происходит, с точки зрения нестандартной оценки, которую использует dplyr
, вероятно, слишком сложна для начинающего класса R. Простое объяснение для пользователя R, обладающего некоторыми знаниями основ, может выглядеть примерно так:
Любые выражения внутри summarise
оцениваются для получения значений, которые будут записаны в столбцы результирующего фрейма данных. Обычно эти выражения передаются как именованные аргументы, чтобы мы могли контролировать имена столбцов:
iris |> summarise(a = pi/2)
#> a
#> 1 1.570796
Если выражение передается как безымянный аргумент, то summarise
захватит выражение, преобразует его в строку и использует ее в качестве имени столбца. Это помимо оценки его использования в качестве значения в столбце.
iris |> summarise(pi/2)
#> pi/2
#> 1 1.570796
Причина, по которой мы не получаем ошибку при использовании присваивания внутри summarise
, заключается в том, что присваивание молча возвращает присвоенное значение:
(a <- 32) == 32
#> [1] TRUE
Итак, в вашем примере выражение
avg_petal_length <- mean(Petal.Length)
оценивается (с использованием маски данных, чтобы Petal.Length
распознавался как столбец в iris
фрейме данных), чтобы дать сводное значение для столбца (3,758), но оно также фиксируется для создания имени столбца.
Пункты обучения для начинающих R:
summarise
, вы должны использовать оператор =
, а не оператор <-
.