Как вы используете tidydots (...), если функция, которую вы пишете, имеет дополнительные параметры? - PullRequest
3 голосов
/ 09 марта 2020

Что я делаю плохо? Я не могу найти что-то конкретное c для этой топи c, документация tidyeval не упоминает об этом.

Написание функции, которая принимает таблицу, фильтрует параметры, группирует параметры и возвращает итоговую таблицу.

createTable <- function(counts, mapper = NULL,day = NULL, week = NULL, month = NULL, ...){

  # Check for optional param
  day_missing <- is.null(day)
  print(day_missing)
  month_missing <- is.null(month)
  week_missing <- is.null(week)
  mapper_missing <- is.null(mapper)

  # reassigns input params to new vars for use with dplyr::filter
  m <- month
  d <- day
  w <- week
  mp <- mapper

  # group, summarise, filter and score counts
  group_vars <- enquos(...)
  counts %>% # counts is always in the same format, which allows for the below filtering
    group_by(!!!group_vars) %>%
    summarise_at(summaryVars, sum) %>% # summaryVars is a global var, always the same variables being summed
    filter(if(month_missing) TRUE else month == m) %>% 
    filter(if(week_missing) TRUE else week == w) %>% 
    filter(if(day_missing) TRUE else day == d) %>%
    filter(if(mapper_missing) TRUE else mapper == mp) %>% 
    calcScores() # calcScores is a global function, it converts the summarised data above into scored data (e.g. count of 10 = scored as 250)

}

Это делает именно то, что мне нужно, но только если все параметры предоставлены неявно

test <- createTable(featureCounts2019, "mcglonee", NULL, NULL, 5, mapper, month, week)

#> Get expected output

test <- createTable(counts = featureCounts2019, mapper = "mcglonee", month = 5, mapper, month, week)

#> This won't work, R won't know what to do with the group_vars

Я подумал о том, чтобы указать group_vars в виде списка и затем добавить его в enquos , но это вызывает у меня ошибку, говоря, что объекты в списке не существуют.

createTable2 <- function(counts, mapper = NULL,day = NULL, week = NULL, month = NULL, group_vars){

  # Check for optional param
  day_missing <- is.null(day)
  month_missing <- is.null(month)
  week_missing <- is.null(week)
  mapper_missing <- is.null(mapper)

  # reassigns input params to new vars for use with dplyr::filter
  m <- month
  d <- day
  w <- week
  mp <- mapper

  group_vars <- unlist(group_vars)
  # group, summarise, filter and score counts
  group_vars <- enquos(group_vars)
  counts %>% # counts is always in the same format, which allows for the below filtering
    group_by(!!!group_vars) %>%
    summarise_at(summaryVars, sum) %>% # summaryVars is a global var, always the same variables being summed
    filter(if(month_missing) TRUE else month == m) %>% 
    filter(if(week_missing) TRUE else week == w) %>% 
    filter(if(day_missing) TRUE else day == d) %>%
    filter(if(mapper_missing) TRUE else mapper == mp) %>% 
    calcScores() # calcScores is a global function, it converts the summarised data above into scored data (e.g. count of 10 = scored as 250)

}

test2 <- createTable2(counts = featureCounts2019, mapper = "mcglonee", month = 5, group_vars = list(mapper, month, week))

#> Error in unlist(group_vars) : object 'mapper' not found

Не конец света, так как эта функция только для меня, но что, если я пишу что-то как часть пакета, я думаю, что люди будут использовать, что тогда? Как вы можете иметь как необязательные параметры, так и использовать tidydots?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...