Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
This time around, since first half of the 2021 is behind us, we are making Calendar in R.
This will be achieved with two useless functions.
Function to draw a month (with optional parameter as current date)
DrawCalendarMonth <- function(InDate=NULL) { if(is.null(InDate)){ date <- Sys.Date() } else { date <- as.Date(InDate) } t <- format(date, "%m") TT <- format(date, "%B") year <- as.integer(format(date, "%Y")) # Leap year calculation if((year %% 4) == 0) { if((year %% 100) == 0) { if((year %% 400) == 0) { leap <- TRUE } else { leap <- FALSE } } else { leap <- TRUE } } else { leap <- FALSE } #number of days in month if (t %in% c("01","03","05", "07", "08", "10", "12")){ nofDays <- 31 } if (t %in% c("04","06","09", "11")){ nofDays <- 30 } if (t %in% c("02") & leap == TRUE){ nofDays <- 29 } if (t %in% c("02") & leap == FALSE){ nofDays <- 28 } firstDay <- as.Date(paste0(format(date, "%Y-%m"), "-01")) name1D <- weekdays(firstDay) num1D <- as.POSIXlt(firstDay)$wday n.col <- 7 #number of days; constant n.row <- 5 #depends on month, number of days and first day in month; must be calculated M_y <- 35 # Default matrix size (product of n.col * n.row) if (num1D > 5 & nofDays > 29) { n.row <- 6 #nrow correction M_y <- 42 } if (num1D %in% c(1) & nofDays %in% c(28)) { n.row <- 4 #nrow correction M_y <- 28 } mat <- matrix(1:M_y, nrow = n.row, ncol = n.col, T) #Matrix structure for month for(column in 1:n.col){ mat[, column] <- 00 } #Reset values to 00 i <- 1 #running value for(row in 1:n.row){ for(column in 1:n.col){ if(row >= 1 & column >= num1D | row > 1) { if(i > nofDays){ mat[row,column] <- 0 } else { mat[row,column] <- i i= i + 1 } } } } dd <- as.data.frame(mat) colnames(dd) <- c("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun") cat(paste0("\n", "Month: ",TT, "\n", "Year: ", year, "\n")) return(dd) }
Running this function as:
DrawCalendarMonth() DrawCalendarMonth("2021-02-21")
Function takes into consideration
1. calculation of leap years,
2. the number of weeks per month and
3. most obvious – number of days per month.
Function to draw a year (with optional parameter year)
Next step is no brainer. Creating calendar for complete year is just 12-times iteration of DrawCalendarMonth function.
DrawYear <- function(Year=NULL){ if(is.null(Year)){ year <- as.integer(format(Sys.Date(), "%Y")) } else { year <- as.integer(Year) } dateFrom <- as.Date(paste0(year,"0101"), "%Y%m%d") dateTo <- as.Date(paste0(year,"1201"), "%Y%m%d") FirstOfMonth <- format(seq(dateFrom,dateTo,by="month"), "%Y-%m-%d") for (i in 1:length(FirstOfMonth)){ r <- DrawCalendarMonth(FirstOfMonth[i]) print(r) } }
Running it as:
# Draw years' calendar DrawYear(2020) DrawYear()
And result is a complete calendar
As always, code is available in at the Github in same Useless_R_function repository. And this function is here.
Happy R-coding!
What are next step for these two functions:
- Create export to Markdown (because why not)
- Sort out the week enumerator (in both functions)
- Set the start of week (Sunday or Monday)
- Draw it with ggplot2 library and colour all important dates, bank holidays and festivals
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.