需要使用变量名时如何使用管道?

时间:2018-09-05 11:44:38

标签: r magrittr

使用管道时,有时我需要使用刚刚定义的变量,这是可以避免的吗?例如,我可以将代码以管道形式排成一行吗?谢谢

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 :(得分:1)

这里有一些替代方法。请注意,%>%extractis_innot来自magrittr,fn$来自gsubfn,discard来自purrr。其他所有内容都来自R。

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"

另请参阅有疑问的评论。

答案 1 :(得分:0)

管道的直接功能将是:

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"))