在函数内部使用group_by

我正在尝试使用dplyr语法编写一个函数,该语法包括在函数内部使用group_by进行分组。 group_by语句似乎存在问题,我无法弄清楚出了什么问题。当我将abc作为参数传递并在函数内部使用select时,它按我期望的那样工作(Gfunc1)。尝试group_by使用相同的参数时,它给我一个错误。

  

错误:列dims未知

请参阅下面的检查表。我真的希望我不要忽略一些令人尴尬的简单事情……无论如何,我们将不胜感激!

library(dplyr)


abc <- c("a","a","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 
lioufei0370 回答:在函数内部使用group_by

可以使用{{}}(我正在使用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)
}

对于rlangdplyr的早期版本,可以使用sym!!来实现:

Gfunc2 <- function(df = NULL,dims) {
  test2 <- df %>% 
    group_by(!!sym(dims))

  assign("test2",envir = .GlobalEnv)
}
Gfunc2(df,"abc")

注意

  1. 将结果存储在列表中而不是将结果发送到.GlobalEnv几乎总是更好。
,

您可以通过将点传递给函数来创建函数。这样,您可以使用NSE进行分组并同时选择多个变量。

Gfunc1 <- function(.df,...) {
  test1 <- .df %>%
    select(...)

  assign("test1",test1,envir = .GlobalEnv)
}

Gfunc2 <- function(.df,...) {

    test2 <- .df %>%
      group_by(...)

    assign("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

要了解更多信息,请考虑RstudioConf的材料,以选择Tidy Eval并进行处理 -slides -video

本文链接:https://www.f2er.com/3118086.html

大家都在问