首页 > 解决方案 > 管道进入`if`返回管道而不评估它

问题描述

我正在尝试实现一个具有可选步骤的管道,该步骤由多个功能的管道组成。它根据一个条件运行这个管道,否则它只是通过原始值。但是我已经尝试使用ifand来实现这个purrr::when,但是在这两种情况下,肯定的情况只是返回管道而不是执行它。

这是一个简单的人为示例。我已经将条件管道简化为只有一个函数,但是能够在TRUE分支内使用 magrittr 管道在这里很重要。

library(magrittr)

maybe_round = function(x, round = TRUE){
  x %>%
    `if`(
      round,
      . %>% round(),
      .
    )
}
> maybe_round(5.3, TRUE)
Functional sequence with the following components:

 1. round(.)

Use 'functions' to extract the individual functions. 
> maybe_round(5.3, FALSE)
[1] 5.3

第二种情况正常工作;它返回原始值不变。但是第一种情况不是,它返回了 magrittr 管道,但实际上并没有用5. 我怎样才能让它按我的意图工作?我认为这与magrittr重写语法树的方式有关,但我无法完全解决。

标签: rpipemagrittr

解决方案


语法. %>% round(.)意味着function(.) round(.). 任何时候 dot 启动一个管道,它都会定义一个函数,而不是一个普通的管道。将圆括号放在圆点周围,以防止圆点启动内部管道。

 maybe_round = function(x, round = TRUE){
   x %>%
     `if`(
       round,
       (.) %>% round(),
       .
     )
 }

maybe_round(5.3, TRUE)
## [1] 5

另一种可能性是将其保留为函数,然后在外部点处评估该函数,如下所示:

 maybe_round = function(x, round = TRUE){
   x %>%
     `if`(
       round,
       (. %>% round())(.),
       .
     )
 }

推荐阅读