使用``magrittr ::`%>%```时magrittr管道出错

时间:2017-05-04 15:05:22

标签: r magrittr

无论出于何种原因我使用magrittr管道语法,并且遇到了一个奇怪的错误,当你 scope 明确限定对%>%的调用时会发生这种错误。我知道使用下面的语法会破坏管道的用途,但我很好奇为什么会出错。

sum的第一次调用按预期工作,并输出1

第二次调用导致错误:Error in pipes[[i]] : subscript out of bounds

library(magrittr)

`%>%`(1,sum())
magrittr::`%>%`(1,sum())

查看管道的源代码我认为错误的原因与操作环境的第一行有关,但我确定它正在引入什么问题。

function (lhs, rhs) {
   parent <- parent.frame()
   env <- new.env(parent = parent)
   chain_parts <- split_chain(match.call(), env = env)

任何人都可以解释这种行为吗?

1 个答案:

答案 0 :(得分:8)

管道参数(%&gt;%,%$%等)在magrittr中实际上都是相同的pipe()函数。函数的第一件事就是使用内部的非导出函数split_chain将调用拆分为其组成部分。

split_chain()获取调用的第一个元素(使用的函数,在本例中为一个管道运算符),并通过另一个名为is_pipe()的内部非导出函数运行它,看起来像:

function(pipe)
{
  identical(pipe, quote(`%>%`))   ||
  identical(pipe, quote(`%T>%`))  ||
  identical(pipe, quote(`%<>%`))  ||
  identical(pipe, quote(`%$%`))
}

如果这不会返回true,则函数退出返回缺少管道类型的列表和导致问题的参数的右侧。在作用域时,调用的第一部分la magrittr::'%>%'包括显式作用域,因此它不能通过这些硬编码检查。