Есть ли способ применить указанные c аргументы эллипса только к определенным функциям, а не к другим? - PullRequest
2 голосов
/ 02 марта 2020

У меня есть две функции, которые оценивают аргументы эллипсов как имена столбцов. Эти функции (sub_fun_1 и sub_fun_2) используют имена этих столбцов для группировки введенных фреймов данных.

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)
}

Однако я не могу использовать одинаковые имена столбцов для обоих наборов данных, так как это может привести к ошибке, т.е. оба набора данных должны быть сгруппированы по уникальным для них именам столбцов.

Есть ли способ указать, какие аргументы эллипсов соответствуют какой функции / фрейму данных? Или, может быть, использовать два уникальных набора аргументов эллипсов?

Я нашел несколько похожих страниц вопросов / ответов, но все еще запутался в topi c и о том, как наилучшим образом реализовать решение моей конкретной проблемы.

1 Ответ

2 голосов
/ 02 марта 2020

Один из вариантов - использовать intersect после преобразования в символы

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
...