Рефакторинг кода - предложения по улучшению кода - PullRequest
0 голосов
/ 06 мая 2020

Проблема: У меня есть следующая функция, которую я хочу написать в стиле dry. Есть ли у кого-нибудь из вас предложения по улучшению этих функций? По сути, функция принимает объект даты и извлекает неделю, квартал, месяц и год в дополнительные столбцы.

Большое спасибо !!

library(data.table)
library(tsibble)

determine_entry_date_aggregations <- function(data, date_col = "OBS_DATE"){
  data[, ":="(entry_date_quarter = yearquarter(get(date_col)),
              entry_date_week = format(get(date_col), "%G W%V"),
              entry_date_month = yearmonth(get(date_col)),
              entry_date_year = year(get(date_col)))]
}
determine_finish_date_aggregations <- function(data, date_col = "FIN_DATE"){
  data[, ":="(finish_date_quarter = yearquarter(get(date_col)),
              finish_date_week = format(get(date_col), "%G W%V"),
              finish_date_month = yearmonth(get(date_col)),
              finish_date_year = year(get(date_col)))]
}

1 Ответ

1 голос
/ 06 мая 2020

Это, наверное, вопрос стиля. Вот один из вариантов сохранения функций в списке и передачи date_col в виде строки в .SDcols:

funlist <- list(date_quarter=yearquarter, 
    date_week=function(x) format(x, "%G W%V"), 
    date_month=yearmonth, 
    date_year=year)

determine_date_aggregations <- function(data, date_col="FIN_DATE", out_col="finish"){
    data[, paste(out_col, names(funlist), sep="_") := 
        lapply(funlist, function(f) f(.SD[[1L]])), .SDcols=date_col]
}

или использование set вместо :=:

determine_date_aggregations <- function(data, date_col="FIN_DATE", out_col="finish") {
    for (f in names(funlist)) {
        set(data, j=paste(out_col, f, sep="_"),
            value=funlist[[f]](data[[date_col]]))
    }
}
...