Search code examples
rdataframeellipsis

Is there a way to apply specific ellipses arguments to only certain functions, and not others?


I have two functions that evaluate ellipses arguments as column names. These functions (sub_fun_1 and sub_fun_2) use these column names to group the inputted data-frames.

main_fun <- function(df1, df2, ...) {

columns <- enquos(...) ### '...' arguments used to specify columns in data-sets

df1_grouped <- sub_fun_1(df1, columns) ### Evaluates 'columns' and groups df1 by column names

df2_grouped <- sub_fun_2(df2, columns) ### Evaluates 'columns' and groups df2 by column names
}
sub_fun_1 <- function(df1, columns) {
df1_grouped <- df1 %>%
group_by(!!! columns)
}

sub_fun_2 <- function(df2, columns) {
df2_grouped <- df2 %>%
group_by(!!! columns)
}

However, I cannot use the same column names for both data-sets, as that would result in an error, i.e. both data-sets will need to be grouped by column names unique to them.

Is there a way I can specify which ellipses arguments correspond to which function/data-frame? Or possibly use two unique sets of ellipses arguments?

I found some similar questions/answers pages, but am still confused on the topic and how to best implement a solution toward my particular problem.


Solution

  • One option is to use intersect after converting to characters

    library(dplyr)
    library(purrr)
    main_fun <- function(data1, data2, ...) {
    
          columns <- map_chr(enquos(...), rlang::quo_name)
          sub_fun1 <- data1 %>% 
                        group_by_at(vars(intersect(names(.), columns))) 
    
          sub_fun2 <- data2 %>% 
                        group_by_at(vars(intersect(names(.), columns))) 
    
          list(sub_fun1, sub_fun2)
    
    
    
    
      }
    
    main_fun(iris, mtcars, gear, vs, Species)
    #[[1]]
    # A tibble: 150 x 5
    # Groups:   Species [3]
    #   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
    #          <dbl>       <dbl>        <dbl>       <dbl> <fct>  
    # 1          5.1         3.5          1.4         0.2 setosa 
    # 2          4.9         3            1.4         0.2 setosa 
    # 3          4.7         3.2          1.3         0.2 setosa 
    # 4          4.6         3.1          1.5         0.2 setosa 
    # 5          5           3.6          1.4         0.2 setosa 
    # 6          5.4         3.9          1.7         0.4 setosa 
    # 7          4.6         3.4          1.4         0.3 setosa 
    # 8          5           3.4          1.5         0.2 setosa 
    # 9          4.4         2.9          1.4         0.2 setosa 
    #10          4.9         3.1          1.5         0.1 setosa 
    # … with 140 more rows
    
    #[[2]]
    # A tibble: 32 x 11
    # Groups:   vs, gear [6]
    #     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
    #   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
    # 1  21       6  160    110  3.9   2.62  16.5     0     1     4     4
    # 2  21       6  160    110  3.9   2.88  17.0     0     1     4     4
    # 3  22.8     4  108     93  3.85  2.32  18.6     1     1     4     1
    # 4  21.4     6  258    110  3.08  3.22  19.4     1     0     3     1
    # 5  18.7     8  360    175  3.15  3.44  17.0     0     0     3     2
    # 6  18.1     6  225    105  2.76  3.46  20.2     1     0     3     1
    # 7  14.3     8  360    245  3.21  3.57  15.8     0     0     3     4
    # 8  24.4     4  147.    62  3.69  3.19  20       1     0     4     2
    # 9  22.8     4  141.    95  3.92  3.15  22.9     1     0     4     2
    #10  19.2     6  168.   123  3.92  3.44  18.3     1     0     4     4
    # … with 22 more rows