R/holiday_query.R

Defines functions holiday_query

Documented in holiday_query

#' Holiday Query
#'
#' An easy query that selects a specific holiday and year or years
#'
#'
#' @param holiday_name A required argument that specifies the holiday name
#' @param holiday_years An optional argument that selects the years for the holiday.
#'     This argument takes four-digit numeric values. It can be a single year,
#'     a range of years, or a vector of different years
#'
#' @return A dataframe of selected holiday dates
#'
#' @examples
#' holiday_query('thanksgiving',2000)
#' holiday_query('new year',2018:2020)
#' holiday_query('mlk day', c(1990,2000,2100))
#'
#' @export
holiday_query = function(holiday_name,holiday_years = NULL){
  holidayR = holiday_data
  if (is.character(holiday_name) && length(holiday_name) == 1){
    p = stringr::str_sub(holiday_name,start = 1L, end = 2L)
    if (p == 'ma' || p == 'ml'){p = 'm'}
  }

  # if holiday is not in the dataset ####
  if (!(p %in% c('n','m','su','pr','me','in','la','co','ve','ha','th','ch'))) {
    print('The holiday is not available')
  } else

  # Select year ####
  {

  if (is.null(holiday_years)){
  holidayR$holiday_2 = tolower(stringr::str_sub(holidayR$holiday,
                                     start = 1L, end = 2L))
  holidayR[which(holidayR$holiday_2 == 'ma'),4] = 'm'
  data = holidayR[which(holidayR$holiday_2 == p),]
  data = data[,-c(2,4)]
  row.names(data) <- seq(nrow(data))
  data}

  else if (holiday_years > 2100 || holiday_years < 1900){
    print('Please enter a year or years between 1900 and 2100')
  }

  else {
    holidayR$holiday_2 = tolower(stringr::str_sub(holidayR$holiday,
                                                 start = 1L, end = 2L))
    holidayR[which(holidayR$holiday_2 == 'ma'),4] = 'm'
    data = holidayR[which(holidayR$holiday_2 == p),]
    data = data[,-c(2,4)]
    data = data[which(data$year %in% holiday_years),]
    row.names(data) <- seq(nrow(data))
    data

  }
 }
}
mingbogo/holidayR documentation built on Jan. 20, 2020, 12:28 p.m.