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())