Basi c концепция канала:
Левая сторона канала - это первый аргумент функции в правой части.
Итак, когда вы делаете:
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 == TRUE
и x == FALSE
рассматриваются как второй аргумент для which
что составляет arr.ind
.
Вы можете остановить это поведение канала, которое является LHS канала в качестве первого аргумента функции в RHS, используя {}
. В этом случае вы получите ожидаемый результат.
x %>% {which(. == TRUE)}
#[1] 1 2 3 5
x %>% {which(. == FALSE)}
#[1] 4
Также обратите внимание, что вам действительно не нужно сравнивать логические значения с ==
.
x %>% which
и
x %>% `!` %>% which
работают одинаково.