R:使用管道 %>% 和 pkg::fo 会导致错误 "Error in .::base : unused argument"

R: Using pipe %>% and pkg::fo leads to error "Error in .::base : unused argument"

我正在使用 magrittr 的管道 %>%,紧接着是 package::function 调用的函数,并得到错误:Error in .::base : 未使用的参数(平均值)

问题是什么?

library(magrittr)
c(1,2) %>%
  base::mean
#> Error in .::base: unused argument (mean)

事实证明,如果您使用进一步的参数调用该函数,它将无法正常工作。简单的解决方案是使用 (.),即 base::mean(.):

library(magrittr)
c(1,2) %>%
  base::mean(.)
#> [1] 1.5

这在以下位置有更详细的解释:magrittr and wrapr Pipes in R, an Examination

发生的事情是 magrittr 对要将先前的值插入到哪个函数中感到困惑。当你做

c(1,2) %>%
  mean

magrittr很容易看出mean是一个指向均值函数的符号。但是当你使用 base::mean 时,事情会变得有点棘手,因为 :: 也是 R 中的一个函数。让我们比较一下 R 中 base::meanbase::mean() 之间的区别它们被翻译成函数调用。

as.list(quote(base::mean))
# [[1]]
# `::`    
# [[2]]
# base    
# [[3]]
# mean

as.list(quote(base::mean()))
#  [[1]]
# base::mean

您可以看到这些解析方式不同。当你输入 base::mean 时,R 将首先看到 :: 函数,并尝试将数字传递到那里。基本上是想打电话

`::`(., base, mean)

这没有意义,这就是给您特定错误消息的原因

但是如果您显式添加 (),R 可以看到您正在尝试调用从 base::mean 返回的函数,因此它会将参数添加到正确的位置。所以你可以做

c(1,2) %>%
  base::mean()

c(1,2) %>%
    (base::mean)

请注意magrittr有一个版本没有这个问题,但它已经很长时间没有被推送到CRAN了。

this 问题中所述,github 版本的 magrittr 管道可以成功处理

c(1,2) %>%
    base::mean
[1] 1.5

这是 4 年前修复的,但从未进入 CRAN。由于大多数人会使用 CRAN 版本,因此我不建议编写依赖于此修复程序的代码。