←
PDF 291 / 520 This is my favorite form, because it focuses on verbs, not nouns. You can read this series of fu
→
English · PDF 291
Original PDF page 291
中文 · PDF 291

这是我最喜欢的形式,因为它关注的是动词,而不是名词。你可以像阅读一系列祈使动作一样阅读这些函数组合。Foo Foo 跳一跳,然后挖一挖,再敲一敲。当然,缺点是你需要熟悉管道操作符。如果你以前从未见过 %>%,你就完全不知道这段代码在做什么。幸运的是,大多数人都能很快掌握这个概念,所以当你与不熟悉管道的人分享代码时,可以很容易地教会他们。

管道的工作原理是执行一种“词法转换”:在幕后,magrittr 会将管道中的代码重新组装成一种通过覆盖中间对象来工作的形式。当你运行前面那样的管道时,magrittr 实际上做了类似这样的事情:

my_pipe <- function(.) { . <- hop(., through = forest) . <- scoop(., up = field_mice) bop(., on = head) } my_pipe(foo_foo)

这意味着管道不适用于两类函数:

  • 使用当前环境的函数。例如,assign() 会在当前环境中创建一个具有给定名称的新变量:

assign("x", 10) x #> [1] 10 "x" %>% assign(100) x #> [1] 10

在管道中使用 assign 不起作用,因为它会将其赋值到 %>% 所使用的一个临时环境中。如果你确实想在管道中使用 assign,必须显式指定环境:

env <- environment() "x" %>% assign(100, envir = env) x #> [1] 100

存在同样问题的其他函数还包括 get() 和 load()。

  • 使用惰性求值的函数。在 R 中,函数参数只有在函数使用它们时才会被计算,而不是在调用之