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

8
无论出于什么原因,我在使用magrittr管道语法时遇到了一个奇怪的错误。当您显式限定对%>%的调用时,会出现此错误。我知道使用以下语法会破坏管道的目的,但我很好奇为什么会出现错误。
第一次对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)

有人可以解释一下这个行为吗?

2
小修正:这不是作用域,而是显式限定名称。作用域通常表示执行环境,在这里没有改变。 - Konrad Rudolph
1个回答

9
管道运算符(%>%、%$%等)实际上都是magrittr中的同一个pipe()函数。该函数的第一件事就是使用一个内部的非导出函数split_chain将调用拆分为其组成部分。
split_chain()获取调用的第一个元素(在本例中是使用的函数,即管道运算符之一),并将其通过另一个内部的非导出函数is_pipe()进行处理,该函数如下:
function(pipe)
{
  identical(pipe, quote(`%>%`))   ||
  identical(pipe, quote(`%T>%`))  ||
  identical(pipe, quote(`%<>%`))  ||
  identical(pipe, quote(`%$%`))
}

如果这个条件不成立,函数就会退出,并返回一个缺少管道类型和参数右侧的列表,这会导致问题。在执行作用域操作时,比如使用magrittr::'%>%',调用的第一部分包括显式的作用域,因此它无法通过这些硬编码的检查。

1
是的!编辑函数is_pipe以包括每个管道的作用域版本并重新构建magrittr可以解决错误。 - Adam Spannbauer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接