在 R NSE 中使用带有空参数的 quos
Using quos with empty argument in R NSE
我正在尝试弄清楚如何在我的 tidyverse
工作流程中的 NSE 函数中使用可选参数。这是一个小玩具功能,我希望能够以此为基础。我希望能够对分组数据框进行操作;在这个例子中,我想收集 df,排除 df 分组所依据的任何列(使用 groups(df)
成功获得这些列)和任何其他可选列,通过 ...
进入。 quos
有一个参数 .ignore_empty
,但我不确定如何准确使用它。我可能误解了 .ignore_empty
的作用。
我知道我可以通过检查缺少的参数来启动该函数,然后设置两组不同的管道操作以确定是否提供了额外的参数,但我更愿意将其保留在单个管道流中。
数据和玩具功能:
library(tidyverse)
df <- structure(list(
town = c("East Haven", "Hamden", "New Haven","West Haven"),
region = c("Inner Ring", "Inner Ring", "New Haven", "Inner Ring"),
Asian = c(1123, 3285, 6042, 2214),
Black = c(693,13209, 42970, 10677),
Latino = c(3820, 6450, 37231, 10977),
Total = c(29015,61476, 130405, 54972),
White = c(22898, 37043, 40164, 28864)),
class = c("tbl_df","tbl", "data.frame"), row.names = c(NA, -4L))
test_dots <- function(df, ...) {
grouping_vars <- groups(df)
gather_vars <- quos(..., .ignore_empty = "all")
df %>%
gather(key = variable, value = value, -c(!!!grouping_vars), -c(!!!gather_vars))
}
使用分组 df 和收到的列名称 ...
:
df %>%
group_by(town) %>%
test_dots(region) %>%
head()
#> # A tibble: 6 x 4
#> # Groups: town [4]
#> town region variable value
#> <chr> <chr> <chr> <dbl>
#> 1 East Haven Inner Ring Asian 1123
#> 2 Hamden Inner Ring Asian 3285
#> 3 New Haven New Haven Asian 6042
#> 4 West Haven Inner Ring Asian 2214
#> 5 East Haven Inner Ring Black 693
#> 6 Hamden Inner Ring Black 13209
有分组 df 但没有进入 ...
:
df %>%
select(-region) %>%
group_by(town) %>%
test_dots()
#> Error in -x: invalid argument to unary operator
由 reprex package (v0.2.0) 创建于 2018-05-10。
提前致谢!
我认为问题在于您正试图否定一个空向量。如果你确定总会有至少一个分组或收集变量,那么你可以做
test_dots <- function(df, ...) {
grouping_vars <- groups(df)
gather_vars <- quos(...)
vars <- quos(c(!!!grouping_vars), c(!!!gather_vars))
df %>%
gather(key = variable, value = value, -c(!!!vars))
}
我不认为 .ignore_empty
与它有任何关系,因为它似乎只是控制 quos
的工作方式,而不是 gather()
。
我正在尝试弄清楚如何在我的 tidyverse
工作流程中的 NSE 函数中使用可选参数。这是一个小玩具功能,我希望能够以此为基础。我希望能够对分组数据框进行操作;在这个例子中,我想收集 df,排除 df 分组所依据的任何列(使用 groups(df)
成功获得这些列)和任何其他可选列,通过 ...
进入。 quos
有一个参数 .ignore_empty
,但我不确定如何准确使用它。我可能误解了 .ignore_empty
的作用。
我知道我可以通过检查缺少的参数来启动该函数,然后设置两组不同的管道操作以确定是否提供了额外的参数,但我更愿意将其保留在单个管道流中。
数据和玩具功能:
library(tidyverse)
df <- structure(list(
town = c("East Haven", "Hamden", "New Haven","West Haven"),
region = c("Inner Ring", "Inner Ring", "New Haven", "Inner Ring"),
Asian = c(1123, 3285, 6042, 2214),
Black = c(693,13209, 42970, 10677),
Latino = c(3820, 6450, 37231, 10977),
Total = c(29015,61476, 130405, 54972),
White = c(22898, 37043, 40164, 28864)),
class = c("tbl_df","tbl", "data.frame"), row.names = c(NA, -4L))
test_dots <- function(df, ...) {
grouping_vars <- groups(df)
gather_vars <- quos(..., .ignore_empty = "all")
df %>%
gather(key = variable, value = value, -c(!!!grouping_vars), -c(!!!gather_vars))
}
使用分组 df 和收到的列名称 ...
:
df %>%
group_by(town) %>%
test_dots(region) %>%
head()
#> # A tibble: 6 x 4
#> # Groups: town [4]
#> town region variable value
#> <chr> <chr> <chr> <dbl>
#> 1 East Haven Inner Ring Asian 1123
#> 2 Hamden Inner Ring Asian 3285
#> 3 New Haven New Haven Asian 6042
#> 4 West Haven Inner Ring Asian 2214
#> 5 East Haven Inner Ring Black 693
#> 6 Hamden Inner Ring Black 13209
有分组 df 但没有进入 ...
:
df %>%
select(-region) %>%
group_by(town) %>%
test_dots()
#> Error in -x: invalid argument to unary operator
由 reprex package (v0.2.0) 创建于 2018-05-10。
提前致谢!
我认为问题在于您正试图否定一个空向量。如果你确定总会有至少一个分组或收集变量,那么你可以做
test_dots <- function(df, ...) {
grouping_vars <- groups(df)
gather_vars <- quos(...)
vars <- quos(c(!!!grouping_vars), c(!!!gather_vars))
df %>%
gather(key = variable, value = value, -c(!!!vars))
}
我不认为 .ignore_empty
与它有任何关系,因为它似乎只是控制 quos
的工作方式,而不是 gather()
。