首页 > 解决方案 > 在函数中使用 group_by

问题描述

我正在尝试使用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 

标签: rgroup-bydplyruser-defined-functions

解决方案


{{}}可以通过使用(我使用的是rlang0.4.1、0.8.3 )来解决这个问题,dplyr如下所示。

问题是在编写依赖于dplyr. 这通常通过整洁的评估/非标准评估(NSE)来完成。我添加df为参数是因为我觉得提供数据集作为参数总是比从外部环境调用它更好。与其他功能不同,为什么Gfunc1有效是因为select它更健壮:dplyr

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

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

对于早期版本的rlangand dplyr,同样可以使用symand实现!!

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

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

笔记

  1. 将结果存储在列表中而不是将它们发送到.GlobalEnv.

推荐阅读