管道中名称空间调用的函数的运算符优先级

时间:2016-10-10 10:43:26

标签: r namespaces dplyr piping magrittr

请有人解释为什么最后一行代码的行为存在差异,当我在管道中使用其命名空间调用函数时,以及错误消息实际意味着什么:

library(magrittr)
1:5 %>% cumsum
#### [1]  1  3  6 10 15
1:5 %>% cumsum()
#### [1]  1  3  6 10 15
1:5 %>% base::cumsum()
#### [1]  1  3  6 10 15
1:5 %>% (base::cumsum)
#### [1]  1  3  6 10 15
1:5 %>% base::cumsum
#### Error in .::base : unused argument (cumsum)

我真的认为它会起作用,因为operator precedence rules表明最高优先级是命名空间运算符::,远离特殊运算符。

感谢。

1 个答案:

答案 0 :(得分:3)

我认为这是因为它调用函数的描述,base::cumsum返回function (x) .Primitive("cumsum"),它不接受任何参数,这就是错误所说的。在您看到上面的一行时添加(),它会使用1:5参数调用该函数。

更好的例子是你自己的功能。

foo<-function(){cat("hello")}
如果不带参数调用

,则返回其代码:

    > foo
function(){cat("hello")}

所以它与base::cumsum类似,但我猜它是以某种方式受到保护或只是编程给你的描述。