Использование кво с пустым аргументом в R NSE - PullRequest
0 голосов
/ 10 мая 2018

Я пытаюсь выяснить, как я могу использовать необязательные аргументы в функции 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).

Заранее спасибо!

1 Ответ

0 голосов
/ 10 мая 2018

Я думаю, проблема в том, что вы пытаетесь свести на нет пустой вектор. Если вы уверены, что всегда будет хотя бы одна переменная группировки или сбора, тогда вы можете сделать

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

...