我正在尝试使用dplyr
语法编写一个函数,该语法包括在函数内部使用group_by进行分组。 group_by
语句似乎存在问题,我无法弄清楚出了什么问题。当我将abc
作为参数传递并在函数内部使用select
时,它按我期望的那样工作(Gfunc1)。尝试group_by
使用相同的参数时,它给我一个错误。
错误:列
dims
未知
请参阅下面的检查表。我真的希望我不要忽略一些令人尴尬的简单事情……无论如何,我们将不胜感激!
library(dplyr)
abc <- c("a","a","a","b","b","c")
num <- c(1,2,3,4,5,6)
df <- data.frame(abc,num)
Gfunc1 <- function(dims) {
test1 <- df %>%
select(dims)
assign("test1", test1, envir = .GlobalEnv)
}
Gfunc2 <- function(dims) {
test2 <- df %>%
group_by(dims)
assign("test2", test2, envir = .GlobalEnv)
}
Gfunc1("abc")
# Returns as expected; df test1 with only col = "abc"
Gfunc2("abc")
# Does not return what i expect; gives error: Error: Column `dims` is unknown
答案 0 :(得分:2)
可以使用{{}}
(我正在使用rlang
0.4.1,dplyr
0.8.3)解决此问题,如下所示。
问题在于,编写依赖于dplyr
的函数时,需要做一些额外的工作。这通常通过整洁的评估/非标准评估(NSE)来完成。我添加了df
作为自变量,因为我认为将数据集作为自变量而不是从外部环境调用总是更好。
Gfunc1
起作用的原因在于select
与其他dplyr
函数不同而更加健壮:
Gfunc2 <- function(df = NULL,dims) {
test2 <- df %>%
group_by({{dims}})
assign("test2", test2, envir = .GlobalEnv)
}
对于rlang
和dplyr
的早期版本,可以使用sym
和!!
来实现:
Gfunc2 <- function(df = NULL,dims) {
test2 <- df %>%
group_by(!!sym(dims))
assign("test2", test2, envir = .GlobalEnv)
}
Gfunc2(df,"abc")
注意
.GlobalEnv
几乎总是更好。答案 1 :(得分:1)
您可以通过将点传递给函数来创建函数。这样,您可以使用NSE进行分组并同时选择多个变量。
Gfunc1 <- function(.df, ...) {
test1 <- .df %>%
select(...)
assign("test1", test1, envir = .GlobalEnv)
}
Gfunc2 <- function(.df, ...) {
test2 <- .df %>%
group_by(...)
assign("test2", test2, envir = .GlobalEnv)
}
Gfunc1(df, abc)
Gfunc2(df, abc)
结果
> test1
abc
1 a
2 a
3 a
4 b
5 b
6 c
test2 %>%
summarise(sum = sum(num))
abc sum
<fct> <dbl>
1 a 6
2 b 9
3 c 6