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

17

如果我这样做:

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] "filter" "lag" "body<-" "intersect" "kronecker" "setdiff" "setequal" "union"
,其中大多数是由dplyr引起的。

我想我不是唯一被这个困惑的人?


通过新的会话,?n 中的示例对我有效。 - Roman Luštrik
5
在dplyr中,n似乎被映射到一个内部函数,而dplyr::n不能被等同对待,只能调用出错的R函数。 - alexis_laz
4
是的,最好将 n 视为传递给知道如何解释它的 C 函数的 summarizemutate 等参数,而不是 R 函数。 - Philippe Marchand
1
你已经加载了 plyr,我猜测。 - Carl
3个回答

20

所以,我并没有真正的问题,我可以避免使用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() 会映射到某个东西并返回组大小。


3
好的,我虽然还是不理解这个设计,但这仍然是一个答案。 ;) - Silverclaw

5

我认为这是plyr和dplyr之间的蒙版问题导致的。不管怎样,下面是解决方法:

dplyr::summarise(count = n())

我该如何应用这个? - Ben

2

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

dplyr中的分组实际上并不会对数据进行任何处理。它只是注明它被分组了。这意味着像mean或n这样的函数需要意识到这一点,并且必须从它们更广泛的上下文中推断出它们应该按组执行计算。它们并不是真正的R函数,R函数并不知道这个上下文。它们基本上是符号,summarize()或mutate()选择以某种方式进行评估(每个组的均值或计数)。我认为Hadley选择直接调用n()时显示错误,因为这比根本没有实现函数要好一些。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接