Dplyr:: n() возвращает "Ошибка: эту функцию нельзя вызывать напрямую"
Если я это сделаю:
dplyr::mutate(MeanValue = mean(RSSI), ReadCount = n())
все работает нормально.
Но когда я пытаюсь квалифицировать функцию:
dplyr::mutate(MeanValue = mean(RSSI), ReadCount = dplyr::n())
Я получаю ошибку, указанную в заголовке.
Итак, у меня действительно нет проблем, я просто могу избежать этого, но мне интересно, почему это происходит. Я уже рассмотрел другой вопрос (dplyr: "Ошибка в n(): функция не должна вызываться напрямую" ), но, насколько мне известно, dplyr является только библиотека, которую я использую. Я попытался сделать то, что предлагает ответ, но
detach(package:plyr)
приводит к
Ошибка в отсоединении (package: plyr): неверный аргумент 'name' и
conflicts()
не упоминает n():
[1] "filter" "lag" "body < -" "intersect" "kronecker" "setdiff" "setequal" "union"
, большинство из которых является причиной dplyr.
Думаю, я не единственный, кто смутился этим?
Ответы
Ответ 1
Итак, у меня нет проблем, я просто могу избежать [writing dplyr::n()
], но мне интересно, почему это происходит.
Здесь исходный код для dplyr::n
в dplyr 0.5.0:
function () {
stop("This function should not be called directly")
}
Вот почему полностью квалифицированная форма вызывает эту ошибку: функция всегда возвращает ошибку. (Мое предположение заключается в том, что функция throw-throwing dplyr::n
существует так, что n()
может иметь типичную страницу документации с примерами.)
Внутри операторов filter
/mutate
/summarise
n()
не вызывает эту функцию. Вместо этого некоторая внутренняя функция вычисляет размеры группы для выражения n()
. Вот почему следующее, когда dplyr не загружается:
n()
#> Error: could not find function "n"
library(magrittr)
iris %>%
dplyr::group_by(Species) %>%
dplyr::summarise(n = n())
#> # A tibble: 3 × 2
#> Species n
#> <fctr> <int>
#> 1 setosa 50
#> 2 versicolor 50
#> 3 virginica 50
Здесь n()
не может быть отображено на функцию, поэтому мы получаем ошибку. Но когда он используется внутри глагола dplyr, n()
действительно что-то отображает и возвращает размеры групп.
Ответ 2
Я знаю, что опоздал на 2 года, но вот мое мнение.
Группировка в dplyr на самом деле ничего не делает с данными. Он просто отмечает его сгруппированы. Это означает, что такие функции, как mean или n, должны знать об этом и должны из своего более широкого контекста выводить, что они должны выполнять свои вычисления в группе. Они не являются реальными функциями, которые не знают об этом контексте. В основном это символы, которые summaze() или mutate() выбирают для оценки определенным образом (означает или рассчитывает на группу). Я думаю, что Хэдли решил показать ошибку, если вы вызываете n() напрямую, поскольку это немного лучше, чем вообще не реализовывать функцию.
Ответ 3
Я думаю, что это происходит в результате маскировки между plyr и dplyr. Во всяком случае это решает это:
dplyr::summarise(count = n())