使用管道时,有时我需要使用刚刚定义的变量,这是可以避免的吗?例如,我可以将代码以管道形式排成一行吗?谢谢
library(magrittr)
A <- c(letters[1:5])
A[which(!A %in% c("a", "b"))]
我正在寻找类似的解决方案:
A <- c(letters[1:5]) %$% .[which(! . %in% c("a","b"))]
答案 0 :(得分:1)
这里有一些替代方法。请注意,%>%
,extract
,is_in
和not
来自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"))