dplyr :: n()返回"错误:不应直接调用此函数"

时间:2016-09-03 09:42:05

标签: r dplyr

如果我这样做:

dplyr::mutate(MeanValue = mean(RSSI), ReadCount = n())
一切正常。 但是,当我尝试对该功能进行限定时:

dplyr::mutate(MeanValue = mean(RSSI), ReadCount = dplyr::n())

我收到了标题中提到的错误。

所以,我真的没有问题,我可以避免这样做,但我很好奇它为什么会发生。我已经看了另一个问题(dplyr: "Error in n(): function should not be called directly"),但据我所知,dplyr是我唯一使用的库。无论如何,我尝试做了答案,但是

detach(package:plyr)

结果

  

分离错误(包:plyr):无效'名称'争论   和

conflicts()

没有提到n():

  

[1]"过滤" "延迟" "&体LT; - " "交叉" "克罗内克" " setdiff" " setequal" "联合"
  ,其中大部分是由dplyr引起的。

我想我不是唯一一个对此感到困惑的人?

3 个答案:

答案 0 :(得分:13)

  

所以,我真的没有问题,我可以避免[写dplyr::n()],但我很好奇它为什么会发生。

以下是dplyr 0.5.0中dplyr::n的源代码:

function () {
    stop("This function should not be called directly")
}

这就是完全限定的表单引发此错误的原因:函数始终返回错误。 (我的猜测是错误抛出函数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()会映射到某个东西并返回组大小。

答案 1 :(得分:1)

我知道我迟到了2年,但这是我的看法。

dplyr中的分组实际上对数据没有任何作用。只是说明它已分组。这意味着均值或n之类的函数需要意识到这一点,并且必须从更广泛的上下文中推断出它们应该按组进行计算。它们不是reallu R函数,它们不了解此上下文。它们基本上是summarise()或mutate()选择以某种方式评估的符号(每组的均值或计数)。我认为如果您直接调用n(),Hadley选择显示错误,因为这比根本没有实现任何功能要好一些。

答案 2 :(得分:1)

我认为这是由于plyr和dplyr之间的掩盖而来的。 无论如何,它都能解决:

dplyr::summarise(count = n())