Что я делаю плохо? Я не могу найти что-то конкретное 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?