管道内有点 dplyr::filter
piping with dot inside dplyr::filter
我正在努力使用 %>% margritr 将内容从 dplyr 传递到函数过滤器内的另一个参数。
我认为这应该有效:
library(dplyr)
library(margritr)
d <- data.frame(a=c(1,2,3),b=c(4,5,6))
c(2,2) %>% filter(d, a %in% .)
但我明白了:
# Error in UseMethod("filter_") :
# no applicable method for 'filter_' applied to an object of class "c('double', 'numeric')"
我希望它的工作方式与此相同:
filter(d, a %in% c(2,2))
# a b
# 1 2 5
我做错了什么?
默认情况下,它将通过管道传输到第一个参数。解决它的唯一方法是明确命名第一个参数:
c(2,2) %>%
filter(.data = d, a %in% .)
但看起来效果不是很好:
a b
1 2 5
Warning message:
In (~.) & (~a %in% .) :
longer object length is not a multiple of shorter object length
P.S。您不需要显式加载 magrittr
,因为 %>%
已经在 dplyr
中
管道设计为在传递第一个参数时围绕其第一个参数组成函数。当你想规避这种行为时,你可以生成一个更灵活的匿名环境。你用大括号来做这件事,就像你写一个函数一样。
5 %>%
{filter(iris, Sepal.Length == .)}
为什么这行得通,写 {somefunctions(x, y)}
等同于写 function(...) {somefunctions(x, y)}
。所以上面的函数忽略了它的参数,而只是评估其环境中的变量。 .
代词由管道为其定义,它在全局环境中搜索其他变量(如iris
)。
我正在努力使用 %>% margritr 将内容从 dplyr 传递到函数过滤器内的另一个参数。
我认为这应该有效:
library(dplyr)
library(margritr)
d <- data.frame(a=c(1,2,3),b=c(4,5,6))
c(2,2) %>% filter(d, a %in% .)
但我明白了:
# Error in UseMethod("filter_") :
# no applicable method for 'filter_' applied to an object of class "c('double', 'numeric')"
我希望它的工作方式与此相同:
filter(d, a %in% c(2,2))
# a b
# 1 2 5
我做错了什么?
默认情况下,它将通过管道传输到第一个参数。解决它的唯一方法是明确命名第一个参数:
c(2,2) %>%
filter(.data = d, a %in% .)
但看起来效果不是很好:
a b
1 2 5
Warning message:
In (~.) & (~a %in% .) :
longer object length is not a multiple of shorter object length
P.S。您不需要显式加载 magrittr
,因为 %>%
已经在 dplyr
管道设计为在传递第一个参数时围绕其第一个参数组成函数。当你想规避这种行为时,你可以生成一个更灵活的匿名环境。你用大括号来做这件事,就像你写一个函数一样。
5 %>%
{filter(iris, Sepal.Length == .)}
为什么这行得通,写 {somefunctions(x, y)}
等同于写 function(...) {somefunctions(x, y)}
。所以上面的函数忽略了它的参数,而只是评估其环境中的变量。 .
代词由管道为其定义,它在全局环境中搜索其他变量(如iris
)。