The arguments in the pipe (%>%,% $%, etc.) are all the same pipe() function in magrittr. One of the first things that a function does is to break the call into its component parts using the internal, not exported split_chain function.
split_chain() takes the first call element (the function used in this case, one of the pipe operators) and runs it through another internal unexported function called is_pipe() , which looks like this:
function(pipe) { identical(pipe, quote(`%>%`)) || identical(pipe, quote(`%T>%`)) || identical(pipe, quote(`%<>%`)) || identical(pipe, quote(`%$%`)) }
if this does not return as true, the function completes the return of a list that does not have a channel type and the right side of the argument that causes problems. When scoping, a la magrittr::'%>%' , the first part of the call includes an explicit scope definition, and therefore it does not perform these hard coded checks.
source share