Как я могу использовать pipe, когда мне нужно использовать имя переменной? - PullRequest
0 голосов
/ 05 сентября 2018

При использовании pipe иногда нужно использовать только что определенные переменные, это можно избежать? типа, я могу передать код в строке? спасибо

library(magrittr)
A <- c(letters[1:5])
A[which(!A %in% c("a", "b"))]

Я ищу решение, подобное:

A <- c(letters[1:5]) %$% .[which(! . %in% c("a","b"))]

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Вот несколько альтернатив. Обратите внимание, что %>%, extract, is_in и not от magrittr, fn$ от gsubfn и discard от purrr. Все остальное от основания Р.

library(magrittr)
A <- letters[1:5]

# 1
A %>% extract(! . %in% c("a", "b"))
## [1] "c" "d" "e"

# 1a
A %>% extract(is_in(.,  c("a", "b") ) %>% not)
## [1] "c" "d" "e"

# 2
A %>% Filter(function(x) ! x %in% c("a", "b"), .)
## [1] "c" "d" "e"

## 2a
library(gsubfn)
A %>% fn$Filter(~ ! x %in% c("a", "b"), .)
## [1] "c" "d" "e"

# 3
A %>% setdiff(c("a", "b"))
## [1] "c" "d" "e"

# 4
A %>% grep("^(a|b)$", ., invert = TRUE, value = TRUE)
## [1] "c" "d" "e"

# 5
library(purrr)
A %>% discard(~ . %in% c("a", "b"))
## [1] "c" "d" "e"

Также см. Комментарии под вопросом для дополнительных альтернатив.

0 голосов
/ 05 сентября 2018

Прямая функция с трубой будет:

A %>% .[which(A!=c("a", "b"))]

потому что функция для конвейера - это []
Также вы можете попробовать использовать функцию match() или %in% вместо A!=c("a", "b") в этом случае Negate('%in%')

Я не могу комментировать, но для обсуждения - используйте факт, который является функциональным языком.

subset_pipe <- function(x, y) {x %>% .[!x %in% y] }
letters[1:5] %>% subset_pipe(c("b", "z"))    
...