r - R 函数中的 Magrittr 管道

标签 r pipeline magrittr

从 (1) 速度和 (2) 有效调试能力的角度来看,是否存在在 R 函数内部使用 magrittr 管道不利的情况?

最佳答案

在函数内部使用管道有优点也有缺点。最大的优点是在阅读代码时更容易看到函数中发生了什么。最大的缺点是错误消息变得更难解释,并且管道违反了 R 的一些评估规则。
这是一个例子。假设我们想要对 mtcars 进行无意义的转换。数据集。这是我们如何用管道做到这一点......

library(tidyverse)
tidy_function <- function() {
  mtcars %>%
    group_by(cyl) %>%
    summarise(disp = sum(disp)) %>%
    mutate(disp = (disp ^ 4) / 10000000000)
}
您可以清楚地看到每个阶段发生的事情,即使它没有做任何有用的事情。现在让我们看看使用 Dagwood Sandwich 方法的时间码...
base_function <- function() {
  mutate(summarise(group_by(mtcars, cyl), disp = sum(disp)), disp = (disp^5) / 10000000000)
}
更难阅读,即使它给了我们相同的结果......
all.equal(tidy_function(), base_function())
# [1] TRUE
避免使用管道或 Dagwood Sandwich 的最常见方法是将每个步骤的结果保存到一个中间变量...
intermediate_function <- function() {
  x <- mtcars
  x <- group_by(x, cyl)
  x <- summarise(x, disp = sum(disp))
  mutate(x, disp = (disp^5) / 10000000000)
}
比上一个函数更具可读性,R 会在出现错误时为您提供更详细的信息。此外,它遵守传统的评估规则。同样,它给出与其他两个函数相同的结果......
all.equal(tidy_function(), intermediate_function())
# [1] TRUE
你特别问了速度,所以让我们通过运行它们每个 1000 次来比较这三个函数......
library(microbenchmark)
timing <-
  microbenchmark(tidy_function(),
                 intermediate_function(),
                 base_function(),
                 times = 1000L)
timing
#Unit: milliseconds
                    #expr      min       lq     mean   median       uq       max neval cld
         #tidy_function() 3.809009 4.403243 5.531429 4.800918 5.860111  23.37589  1000   a
 #intermediate_function() 3.560666 4.106216 5.154006 4.519938 5.538834  21.43292  1000   a
         #base_function() 3.610992 4.136850 5.519869 4.583573 5.696737 203.66175  1000   a
即使在这个简单的例子中,管道也比其他两个选项慢一点。
结论
如果它是您编写代码最舒适的方式,请随意在您的函数中使用管道。如果您开始遇到问题,或者如果您需要尽可能快地编写代码,请切换到不同的范式。

关于r - R 函数中的 Magrittr 管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45150225/

相关文章:

r - 在 Shiny 的 react 函数中使用 dplyr 条件过滤器

python - 将 n_features_to_select RFE 设置为管道中的百分比

powershell - 脚本似乎只处理管道中的最后一个对象

r - R中%>%是什么意思

r - 使用ggplot2的插图

performance - 为什么数据转发和停顿周期在处理负载使用风险方面比 NOP 更有效?

rvest:for循环/映射使用html_node和html_table拉取多个表

R:如何编写函数以从数据帧中提取特定值以便输入另一个数据帧

r - 使用列名作为 data.table 中公式的输入

R范围: force variable substitution in function without local environment