Проблема:
Я хочу использовать across()
программно, чтобы при передаче ему, например, NULL
или пустой строки, функция не завершилась ошибкой. Возможно, здесь используются варианты функций с ограниченной областью действия, такие как group_by_at()
, но я бы хотел, чтобы он работал аккуратно (т.е. без операторов if), используя across()
.
Обратите внимание, что в настоящее время across()
будет влияет на все столбцы, если оставить пустым. Я не уверен, какова мотивация для этого; для меня было бы больше смысла, если бы никакие столбцы не были затронуты.
Пример
Вот быстрый пример использования функций для вычисления среднего значения переменной y
. Передача группирующей переменной работает с group_by_at()
, но не с across()
, как показано:
my_df <- tibble("x" = c("a", "a", "b", "b"), y = 1:4)
compute_mean1 <- function(df, grouping) { # compute grouped mean with across()
df %>%
group_by(across(all_of(grouping))) %>%
summarise(y = mean(y), .groups = "drop")
}
compute_mean2 <- function(df, grouping) { # compute grouped mean with group_by_at()
df %>%
group_by_at(grouping) %>%
summarise(y = mean(y), .groups = "drop")
}
compute_mean1(my_df, "x")
#> # A tibble: 2 x 2
#> x y
#> <chr> <dbl>
#> 1 a 1.5
#> 2 b 3.5
compute_mean1(my_df, NULL)
#> Error: `vars` must be a character vector.
compute_mean2(my_df, "x")
#> # A tibble: 2 x 2
#> x y
#> <chr> <dbl>
#> 1 a 1.5
#> 2 b 3.5
compute_mean2(my_df, NULL)
#> # A tibble: 1 x 1
#> y
#> <dbl>
#> 1 2.5
Создано 14.07.2020 пакетом REPEX (v0 .3.0)