Я пытаюсь выяснить, как я могу использовать необязательные аргументы в функции NSE в моем tidyverse
рабочем процессе.Это маленькая игрушечная функция, которую я хотел бы использовать.Я хочу иметь возможность работать с сгруппированным кадром данных;в этом примере я хотел бы собрать 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
Создано в 2018-05-10 пакетом представлением (v0.2.0).
Заранее спасибо!