【问题标题】:dplyr::n() returns "Error: This function should not be called directly"dplyr::n() 返回“错误:不应直接调用此函数”
【发布时间】:2017-01-11 08:12:05
【问题描述】:

如果我这样做:

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]“过滤器”“滞后”“主体 , 大部分是 dplyr 造成的。

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

【问题讨论】:

  • 在新会话中,?n 中的示例对我有用。
  • n in dplyr 似乎是 mapped 到一个内部函数,而 dplyr::n 不能被平等对待,只是调用 -error give- R 函数。
  • 是的,最好不要将n 视为一个 R 函数,而是将其作为 summarizemutate 等的参数传递给知道如何处理的 C 函数解释它。
  • 你加载了 plyr 我猜

标签: r dplyr


【解决方案1】:

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

【讨论】:

  • 好吧,我还是不明白这个设计,但它仍然是一个答案。 ;)
【解决方案2】:

我认为这是 plyr 和 dplyr 之间屏蔽的结果。 无论如何,这解决了它:

dplyr::summarise(count = n())

【讨论】:

  • 我该如何应用这个?
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2014-05-13
    • 2019-04-24
    • 2023-03-06
    • 1970-01-01
    • 2018-06-05
    相关资源
    最近更新 更多