←
PDF 292 / 520 When Not to Use the Pipe
→
English · PDF 292
Original PDF page 292
中文 · PDF 292

ing the function。管道会依次计算每个元素,所以你不能依赖这种行为。

一个会出现问题的地方是 tryCatch(),它让你捕获并处理错误:

tryCatch(stop("!"), error = function(e) "An error") #> [1] "An error" stop("!") %>% tryCatch(error = function(e) "An error") #> Error in eval(expr, envir, enclos): !

具有这种行为的一类函数相当多,包括 base R 中的 try()、suppressMessages() 和 suppressWarnings()。

何时不使用管道

管道是一个强大的工具,但它并不是你唯一可用的工具,也不能解决所有问题!管道最适合用于重写相当短的线性操作序列。我认为在以下情况下你应该使用其他工具:

  • 你的管道超过(比如)10 步。在这种情况下,应创建具有有意义名称的中间对象。这会让调试更容易,因为你可以更轻松地检查中间结果,也让代码更易于理解,因为变量名有助于传达意图。
  • 你有多个输入或输出。如果没有一个主要的对象在被转换,而是两个或更多对象被组合在一起,就不要使用管道。
  • 你开始考虑具有复杂依赖结构的有向图。管道本质上是线性的,用它们表达复杂关系通常会产生令人困惑的代码。

magrittr 的其他工具

tidyverse 中的所有包都会自动使 %>% 可用,所以你通常不需要显式加载 magrittr。不过,还有