哪个功能与 magrittr

which function with magrittr

我不明白为什么 magrittr 和 which 函数的组合不起作用!!

> x <- c(TRUE, TRUE, TRUE, FALSE, TRUE)
> x %>% which(. == TRUE)
[1] 1 2 3 5
> x %>% which(. == FALSE)
[1] 1 2 3 5

最后一个显然是错误的。 然而这有效:

> x %>% (function(s){which(s==TRUE)})
[1] 1 2 3 5
> x %>% (function(s){which(s==FALSE)})
[1] 4

这也有效:

> x %>% which
[1] 1 2 3 5
> (!x) %>% which
[1] 4
> 

我猜是'.'符号不适用于等效符号“==”

有什么想法吗? 提前赞赏

我刚刚意识到这个问题的答案,它需要一个逻辑输入并且只检查它是否为真 所以我必须先将 x 更改为逻辑值

> (x == TRUE) %>% which()
[1] 1 2 3 5
> (x == FALSE) %>% which()
[1] 4

这也有效

> x %>% equals(., TRUE) %>% which()
[1] 1 2 3 5
> x %>% equals(., FALSE) %>% which()
[1] 4

我对最丑管道的尝试:

x %>% `==`(FALSE) %>% which()

我还是不知道为什么

x %>% which(. == FALSE)

不起作用

我认为 magrittr 函数以某种方式忽略了参数的所有其余部分

> x %>% which(. <= 3 + 3)
[1] 1 2 3 5

管道的基本概念:

管道的左侧是右侧函数的第一个参数。

所以当你这样做时:

c(1, 2, 3) %>% sum
#[1] 6

这意味着你正在做:

sum(c(1, 2, 3))
#[1] 6

同样,当您这样做时:

x <- c(TRUE, TRUE, TRUE, FALSE, TRUE)
x %>% which(. == TRUE)
#[1] 1 2 3 5

说明你在做

which(x, x == TRUE)
#[1] 1 2 3 5

x %>% which(. == FALSE)
#[1] 1 2 3 5

相同
which(x, x == FALSE)
#[1] 1 2 3 5

因此,当使用管道时,x == TRUEx == FALSE 被视为 which 的第二个参数,即 arr.ind

您可以通过使用 {} 停止管道的这种行为,即管道的 LHS 作为 RHS 中函数的第一个参数。在这种情况下,您将获得预期的输出。

x %>% {which(. == TRUE)}
#[1] 1 2 3 5

x %>% {which(. == FALSE)}
#[1] 4

另请注意,您实际上并不需要将逻辑值与 == 进行比较。

x %>% which

x %>% `!` %>% which

以同样的方式工作。