如何将管道变成不平等?

时间:2017-11-09 18:12:40

标签: r piping magrittr

这已经出现在多个实例中,我不知道这个当前实例是否适用于我出现这种情况的许多情况,但我希望答案可能会有所启发。

最简单的版本是我正在进行一些数据处理并希望对管道的结果进行评估。一个简单的例子是:

> seq(9) %>% > 4
Error: unexpected '>' in "seq(9) %>% >"
> seq(9) %>% . > 4
Error in .(.) : could not find function "."

所需的输出是逻辑矢量

FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE

在许多情况下,我想评估一些管道输出,但必须分配它,然后执行评估才能工作:

seq(9) -> vec
vec > 4

有没有办法完全在管道链中完成这些类型的评估?

4 个答案:

答案 0 :(得分:4)

如果您只想使用竖线,则需要使用花括号。

seq(9) %>% {. > 4}

[1] FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE

如果您打算使用purrr,我建议使用library(purrr) map_lgl(seq(9), ~.x > 4) [1] FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE ,因为它会导致代码更易读。

//img[contains(@id,'imgRadioBtnUnchk')]

答案 1 :(得分:3)

另一个选择是将>函数作为函数而不是运算符调用:

> seq(9) %>% `>`(4)
[1] FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE
> seq(9) %>% '>'(4)
[1] FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE

我认为反引号最有意义,但在这种情况下,常规引号也有效。

答案 2 :(得分:2)

magrittr提供“别名”以将二元运算符转换为可管道函数。我自己并不关心他们,但你可以做到

library(magrittr)
seq(9) %>% is_greater_than(4)

请参阅?add的完整列表(这是+的别名)。从+[[的所有内容都有实现。

答案 3 :(得分:1)

在更广泛的背景下,使用mutate

可以轻松完成此操作
library(dplyr)
data_frame(x=1:9) %>% mutate(big_x = x>4)

未经请求的意见:如果您主要使用原子载体,我怀疑整齐/管道方法会比它的价值更麻烦。正如另一个答案建议的那样,你可以使用purrr,但同样,基础R可以很好地运作。更多问题的背景可能会有所帮助。