无论出于何种原因我使用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)
任何人都可以解释这种行为吗?
答案 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::'%>%'
包括显式作用域,因此它不能通过这些硬编码检查。