r - 管道进入`if`返回管道而不评估它
问题描述
我正在尝试实现一个具有可选步骤的管道,该步骤由多个功能的管道组成。它根据一个条件运行这个管道,否则它只是通过原始值。但是我已经尝试使用if
and来实现这个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
重写语法树的方式有关,但我无法完全解决。
解决方案
语法. %>% 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())(.),
.
)
}
推荐阅读
- python - 当图像中并非所有值都存在时,强制“imshow”根据“Colormap”颜色正确着色像素?
- python - 单变量函数上的 Basin-Hoping 方法的界限
- reactjs - `useMemo` 没有按预期工作,它引入了一个无限的 lopp
- node.js - Node JS 应用程序没有从邮递员那里获取值
- regex - 使用 Perl 脚本将数字替换为 XML 文件中的字符串
- unit-testing - 如何使用 Mockito 使用 lambda 模拟内联函数
- graphql - Gatsby 的 markdown 文件之间的映射
- python - py2app ImportError:没有名为 sip 的模块
- python - 与 Numpy Python 索引相关的方程式
- javascript - Vuejs iframe 干扰路由器