которые работают с magrittr - PullRequest
1 голос
/ 28 мая 2020

Я не понимаю, почему комбинация 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
> 

Я думаю, '.' нотация не будет работать с эквивалентным знаком '=='

Есть идеи? Оценивается заранее

Ответы [ 4 ]

1 голос
/ 28 мая 2020

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

работают одинаково.

1 голос
/ 28 мая 2020

Я до сих пор не знаю, почему

x %>% which(. == FALSE)

не работает

Я думаю, что функция magrittr каким-то образом игнорирует все остальные аргументы

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

0 голосов
/ 28 мая 2020

Моя попытка самого уродливого конвейера:

x %>% `==`(FALSE) %>% which()
0 голосов
/ 28 мая 2020

Я только что понял ответ на этот вопрос, который требует логического ввода и проверяет только его истинность, поэтому мне нужно сначала изменить 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...