如何将管道送入不平等?

How to feed pipe into an inequality?

这在多个实例中都出现过,我不知道当前这个实例是否可以推广到我遇到的许多情况,但我希望答案能有所启发。

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

> 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

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

如果你只想使用管道,你需要使用大括号。

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

在更广泛的背景下,这很容易用 mutate:

library(dplyr)
data_frame(x=1:9) %>% mutate(big_x = x>4)

未经请求的意见:如果您主要使用原子向量,我怀疑 tidyverse/piping 方法会比它的价值更麻烦。正如另一个答案所暗示的那样,您可以使用 purrr,但同样,base R 可能工作得很好。为您的问题提供更多背景信息可能会有所帮助。

magrittr 提供 "aliases" 将二元运算符转换为管道函数。我自己不关心他们,但你可以做

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

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

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

> 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

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