有没有办法将特定的省略号参数仅应用于某些函数,而不应用于其他函数?
Is there a way to apply specific ellipses arguments to only certain functions, and not others?
我有两个函数将省略号参数计算为列名。这些函数(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)
}
但是,我不能对两个数据集使用相同的列名,因为那样会导致错误,即两个数据集都需要按列分组他们独有的名字。
有没有一种方法可以指定哪些省略号参数对应于哪些 function/data-frame?或者可能使用两组独特的省略号参数?
我发现了一些类似的 questions/answers 页面,但我仍然对主题以及如何针对我的特定问题实施最佳解决方案感到困惑。
一种选择是在转换为字符后使用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
我有两个函数将省略号参数计算为列名。这些函数(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)
}
但是,我不能对两个数据集使用相同的列名,因为那样会导致错误,即两个数据集都需要按列分组他们独有的名字。
有没有一种方法可以指定哪些省略号参数对应于哪些 function/data-frame?或者可能使用两组独特的省略号参数?
我发现了一些类似的 questions/answers 页面,但我仍然对主题以及如何针对我的特定问题实施最佳解决方案感到困惑。
一种选择是在转换为字符后使用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