calendar
calendar copied to clipboard
Add vignette showing use for ics file creation
E.g. building on this:
# Aim: create ical of all lectures and practicals of TDS
# install required package:
devtools::install_github("ATFutures/calendar")
#> Skipping install of 'calendar' from a github remote, the SHA1 (4efa5ba6) has not changed since last install.
#> Use `force = TRUE` to force installation
# Manual input ----
# First thought was to capture the data hosted at:
# http://timetable.leeds.ac.uk/teaching/201819/reporting/individual;?objectclass=module&idtype=name&identifier=TRAN5340M01&&template=SWSCUST+module+Individual&days=1-7&weeks=1-52&periods=1-21
# found from: http://timetable.leeds.ac.uk/teaching/201819/module.htm
library(rvest)
#> Loading required package: xml2
# vignette("selectorgadget") # check how it works...
u = "http://timetable.leeds.ac.uk/teaching/201819/reporting/TextSpreadsheet?objectclass=module&idtype=name&identifier=TRAN5340M01&template=SWSCUST+module+individual&days=1-7&periods=1-21&weeks=1-52"
day_of_week = 2
session_ids = c(
"intro",
"software",
"structure",
"cleaning",
"accessing",
"processing",
"viz",
"ml",
"project",
"prof"
)
session_descriptions = c(
"Introduction to transport data science",
"Software for practical data science",
"The structure of transport data",
"Data cleaning and subsetting",
"Accessing data from web sources",
"Routing",
"Data visualization",
"Machine learning",
"Project work",
"Professional issues"
)
html = read_html(u)
tt_html = html_nodes(html, ".spreadsheet") %>% html_text()
extract_column = function(x, n) {
nodes = html_nodes(x, paste0(".spreadsheet td:nth-child(", n, ")"))
html_text(nodes)[-1]
}
extract_column_name = function(x, n) {
nodes = html_nodes(x, paste0(".spreadsheet td:nth-child(", n, ")"))
html_text(nodes)[1]
}
cols = c(1:3, 7:11)
colum_names = purrr::map_chr(cols, ~ extract_column_name(html, .x))
tt_list = purrr::map(cols, ~ extract_column(html, .x))
names(tt_list) = colum_names
tt_df = tibble::as_tibble(tt_list)
tt_df$Weekday = day_of_week
# get dates -----
w14_start = as.Date("2019-01-28")
week_num = c(14:22, paste0("E", 1:4), 23:30)
n_weeks = length(week_num)
week_commencing = seq(from = w14_start, by = "week", length.out = n_weeks)
weeks = tibble::data_frame(week_num, week_commencing)
x = tt_df$Weeks[1]
extract_weeks = function(x) {
r_expression = paste0(
"c(",
gsub(pattern = "-", replacement = ":", x = x),
")"
)
eval(parse(text = r_expression))
}
extract_week_commencing = function(x) {
weeks_n = tibble::data_frame(week_num = as.character(extract_weeks(x)))
dplyr::inner_join(weeks_n, weeks)
}
extract_week_commencing(x)
#> Joining, by = "week_num"
#> # A tibble: 10 x 2
#> week_num week_commencing
#> <chr> <date>
#> 1 15 2019-02-04
#> 2 16 2019-02-11
#> 3 17 2019-02-18
#> 4 19 2019-03-04
#> 5 20 2019-03-11
#> 6 21 2019-03-18
#> 7 22 2019-03-25
#> 8 23 2019-04-29
#> 9 24 2019-05-06
#> 10 25 2019-05-13
extract_attributes = function(tt_df) {
tt_i = extract_week_commencing(tt_df$Weeks[1])
tt_i$code = tt_df$`Module code (or codes if jointly taught)`[1]
tt_i$type = tt_df$`Type of activity`[1]
tt_i$type = gsub(pattern = " 1| Based Learning 1", replacement = "", tt_i$type)
tt_i$type = gsub(pattern = "Computer", replacement = "Practical", tt_i$type)
tt_i$LOCATION = tt_df$Location[1]
tt_i$day_of_week = tt_df$Weekday[1]
tt_i$DTSTART = lubridate::ymd_hm(paste(tt_i$week_commencing + day_of_week - 1, tt_df$Start[1]))
tt_i$DTEND = lubridate::ymd_hm(paste(tt_i$week_commencing + day_of_week - 1, tt_df$End[1]))
tt_i$size = tt_df$Size[1]
tt_i$staff = tt_df$`Teaching staff`[1]
tt_i
}
# iterate over each type of event
i = 1
for(i in seq(nrow(tt_df))) {
tti = extract_attributes(tt_df[i, ])
if(i == 1) {
tt = tti
} else (
tt = rbind(tt, tti)
)
}
#> Joining, by = "week_num"
#> Joining, by = "week_num"
tt$SUMMARY = paste0(
"TDS ",
tt$type,
": ",
rep(session_ids, 2)
)
tt$id = paste(rep(session_ids, each = 2), tt$type)
tt$DESCRIPTION = paste0(rep(session_descriptions, each = 2), ", ", gsub(pattern = " 1| Based Learning 1", replacement = "", tt$type))
tt$staff = "Dr Robin Lovelace"
tt$staff[c(5:6, 17:18)] = "Dr Richard Connors"
tt$staff[c(11:12)] = "Dr Malcolm Morgan"
tt$DESCRIPTION = paste0(tt$DESCRIPTION, ", taught by: ", tt$staff)
tt = dplyr::arrange(tt, DTSTART)
tt_min = dplyr::select(tt, SUMMARY, DESCRIPTION, DTSTART, DTEND, LOCATION, UID = id)
tt_min
#> # A tibble: 20 x 6
#> SUMMARY DESCRIPTION DTSTART DTEND LOCATION
#> <chr> <chr> <dttm> <dttm> <chr>
#> 1 TDS Le… Introducti… 2019-02-05 12:30:00 2019-02-05 13:30:00 EC Ston…
#> 2 TDS Pr… Routing, P… 2019-02-05 14:00:00 2019-02-05 15:30:00 West Te…
#> 3 TDS Le… Introducti… 2019-02-12 12:30:00 2019-02-12 13:30:00 EC Ston…
#> 4 TDS Pr… Routing, P… 2019-02-12 14:00:00 2019-02-12 15:30:00 West Te…
#> 5 TDS Le… Software f… 2019-02-19 12:30:00 2019-02-19 13:30:00 EC Ston…
#> 6 TDS Pr… Data visua… 2019-02-19 14:00:00 2019-02-19 15:30:00 West Te…
#> 7 TDS Le… Software f… 2019-03-05 12:30:00 2019-03-05 13:30:00 EC Ston…
#> 8 TDS Pr… Data visua… 2019-03-05 14:00:00 2019-03-05 15:30:00 West Te…
#> 9 TDS Le… The struct… 2019-03-12 12:30:00 2019-03-12 13:30:00 EC Ston…
#> 10 TDS Pr… Machine le… 2019-03-12 14:00:00 2019-03-12 15:30:00 West Te…
#> 11 TDS Le… The struct… 2019-03-19 12:30:00 2019-03-19 13:30:00 EC Ston…
#> 12 TDS Pr… Machine le… 2019-03-19 14:00:00 2019-03-19 15:30:00 West Te…
#> 13 TDS Le… Data clean… 2019-03-26 12:30:00 2019-03-26 13:30:00 EC Ston…
#> 14 TDS Pr… Project wo… 2019-03-26 14:00:00 2019-03-26 15:30:00 West Te…
#> 15 TDS Le… Data clean… 2019-04-30 12:30:00 2019-04-30 13:30:00 EC Ston…
#> 16 TDS Pr… Project wo… 2019-04-30 14:00:00 2019-04-30 15:30:00 West Te…
#> 17 TDS Le… Accessing … 2019-05-07 12:30:00 2019-05-07 13:30:00 EC Ston…
#> 18 TDS Pr… Profession… 2019-05-07 14:00:00 2019-05-07 15:30:00 West Te…
#> 19 TDS Le… Accessing … 2019-05-14 12:30:00 2019-05-14 13:30:00 EC Ston…
#> 20 TDS Pr… Profession… 2019-05-14 14:00:00 2019-05-14 15:30:00 West Te…
#> # ... with 1 more variable: UID <chr>
submission_deadline = tt_min[1, ]
submission_deadline$SUMMARY = "Deadline: report submission"
submission_deadline$DESCRIPTION = "Hand-in deadline of portfolio of work"
submission_deadline$DTSTART = lubridate::ymd_hm("2019-05-07 09:00")
submission_deadline$DTEND = lubridate::ymd_hm("2019-05-07 09:00")
submission_deadline$LOCATION = "ITS reception (40 University Road) and online"
submission_deadline$UID = "submission"
ic = calendar::ical(tt_min)
calendar::ic_write(ic, "tds-timetable.ics")
readr::write_csv(ic, "timetable.csv")
ic
#> # A tibble: 20 x 6
#> SUMMARY DESCRIPTION DTSTART DTEND LOCATION
#> <chr> <chr> <dttm> <dttm> <chr>
#> 1 TDS Le… Introducti… 2019-02-05 12:30:00 2019-02-05 13:30:00 EC Ston…
#> 2 TDS Pr… Routing, P… 2019-02-05 14:00:00 2019-02-05 15:30:00 West Te…
#> 3 TDS Le… Introducti… 2019-02-12 12:30:00 2019-02-12 13:30:00 EC Ston…
#> 4 TDS Pr… Routing, P… 2019-02-12 14:00:00 2019-02-12 15:30:00 West Te…
#> 5 TDS Le… Software f… 2019-02-19 12:30:00 2019-02-19 13:30:00 EC Ston…
#> 6 TDS Pr… Data visua… 2019-02-19 14:00:00 2019-02-19 15:30:00 West Te…
#> 7 TDS Le… Software f… 2019-03-05 12:30:00 2019-03-05 13:30:00 EC Ston…
#> 8 TDS Pr… Data visua… 2019-03-05 14:00:00 2019-03-05 15:30:00 West Te…
#> 9 TDS Le… The struct… 2019-03-12 12:30:00 2019-03-12 13:30:00 EC Ston…
#> 10 TDS Pr… Machine le… 2019-03-12 14:00:00 2019-03-12 15:30:00 West Te…
#> 11 TDS Le… The struct… 2019-03-19 12:30:00 2019-03-19 13:30:00 EC Ston…
#> 12 TDS Pr… Machine le… 2019-03-19 14:00:00 2019-03-19 15:30:00 West Te…
#> 13 TDS Le… Data clean… 2019-03-26 12:30:00 2019-03-26 13:30:00 EC Ston…
#> 14 TDS Pr… Project wo… 2019-03-26 14:00:00 2019-03-26 15:30:00 West Te…
#> 15 TDS Le… Data clean… 2019-04-30 12:30:00 2019-04-30 13:30:00 EC Ston…
#> 16 TDS Pr… Project wo… 2019-04-30 14:00:00 2019-04-30 15:30:00 West Te…
#> 17 TDS Le… Accessing … 2019-05-07 12:30:00 2019-05-07 13:30:00 EC Ston…
#> 18 TDS Pr… Profession… 2019-05-07 14:00:00 2019-05-07 15:30:00 West Te…
#> 19 TDS Le… Accessing … 2019-05-14 12:30:00 2019-05-14 13:30:00 EC Ston…
#> 20 TDS Pr… Profession… 2019-05-14 14:00:00 2019-05-14 15:30:00 West Te…
#> # ... with 1 more variable: UID <chr>
readLines("tds-timetable.ics")
#> [1] "BEGIN:VCALENDAR"
#> [2] "PRODID:ATFutures/calendar"
#> [3] "VERSION:2.0"
#> [4] "CALSCALE:GREGORIAN"
#> [5] "METHOD:PUBLISH"
#> [6] "BEGIN:VEVENT"
#> [7] "SUMMARY:TDS Lecture: intro"
#> [8] "DESCRIPTION:Introduction to transport data science, Lecture, taught by: Dr Robin Lovelace"
#> [9] "DTSTART:20190205T123000"
#> [10] "DTEND:20190205T133000"
#> [11] "LOCATION:EC Stoner SR (7.76)"
#> [12] "UID:intro Lecture"
#> [13] "END:VEVENT"
#> [14] "BEGIN:VEVENT"
#> [15] "SUMMARY:TDS Practical: intro"
#> [16] "DESCRIPTION:Routing, Practical, taught by: Dr Malcolm Morgan"
#> [17] "DTSTART:20190205T140000"
#> [18] "DTEND:20190205T153000"
#> [19] "LOCATION:West Teaching Lab Cluster (G.29)"
#> [20] "UID:processing Practical"
#> [21] "END:VEVENT"
#> [22] "BEGIN:VEVENT"
#> [23] "SUMMARY:TDS Lecture: software"
#> [24] "DESCRIPTION:Introduction to transport data science, Lecture, taught by: Dr Robin Lovelace"
#> [25] "DTSTART:20190212T123000"
#> [26] "DTEND:20190212T133000"
#> [27] "LOCATION:EC Stoner SR (7.76)"
#> [28] "UID:intro Lecture"
#> [29] "END:VEVENT"
#> [30] "BEGIN:VEVENT"
#> [31] "SUMMARY:TDS Practical: software"
#> [32] "DESCRIPTION:Routing, Practical, taught by: Dr Malcolm Morgan"
#> [33] "DTSTART:20190212T140000"
#> [34] "DTEND:20190212T153000"
#> [35] "LOCATION:West Teaching Lab Cluster (G.29)"
#> [36] "UID:processing Practical"
#> [37] "END:VEVENT"
#> [38] "BEGIN:VEVENT"
#> [39] "SUMMARY:TDS Lecture: structure"
#> [40] "DESCRIPTION:Software for practical data science, Lecture, taught by: Dr Robin Lovelace"
#> [41] "DTSTART:20190219T123000"
#> [42] "DTEND:20190219T133000"
#> [43] "LOCATION:EC Stoner SR (7.76)"
#> [44] "UID:software Lecture"
#> [45] "END:VEVENT"
#> [46] "BEGIN:VEVENT"
#> [47] "SUMMARY:TDS Practical: structure"
#> [48] "DESCRIPTION:Data visualization, Practical, taught by: Dr Robin Lovelace"
#> [49] "DTSTART:20190219T140000"
#> [50] "DTEND:20190219T153000"
#> [51] "LOCATION:West Teaching Lab Cluster (G.29)"
#> [52] "UID:viz Practical"
#> [53] "END:VEVENT"
#> [54] "BEGIN:VEVENT"
#> [55] "SUMMARY:TDS Lecture: cleaning"
#> [56] "DESCRIPTION:Software for practical data science, Lecture, taught by: Dr Robin Lovelace"
#> [57] "DTSTART:20190305T123000"
#> [58] "DTEND:20190305T133000"
#> [59] "LOCATION:EC Stoner SR (7.76)"
#> [60] "UID:software Lecture"
#> [61] "END:VEVENT"
#> [62] "BEGIN:VEVENT"
#> [63] "SUMMARY:TDS Practical: cleaning"
#> [64] "DESCRIPTION:Data visualization, Practical, taught by: Dr Robin Lovelace"
#> [65] "DTSTART:20190305T140000"
#> [66] "DTEND:20190305T153000"
#> [67] "LOCATION:West Teaching Lab Cluster (G.29)"
#> [68] "UID:viz Practical"
#> [69] "END:VEVENT"
#> [70] "BEGIN:VEVENT"
#> [71] "SUMMARY:TDS Lecture: accessing"
#> [72] "DESCRIPTION:The structure of transport data, Lecture, taught by: Dr Richard Connors"
#> [73] "DTSTART:20190312T123000"
#> [74] "DTEND:20190312T133000"
#> [75] "LOCATION:EC Stoner SR (7.76)"
#> [76] "UID:structure Lecture"
#> [77] "END:VEVENT"
#> [78] "BEGIN:VEVENT"
#> [79] "SUMMARY:TDS Practical: accessing"
#> [80] "DESCRIPTION:Machine learning, Practical, taught by: Dr Robin Lovelace"
#> [81] "DTSTART:20190312T140000"
#> [82] "DTEND:20190312T153000"
#> [83] "LOCATION:West Teaching Lab Cluster (G.29)"
#> [84] "UID:ml Practical"
#> [85] "END:VEVENT"
#> [86] "BEGIN:VEVENT"
#> [87] "SUMMARY:TDS Lecture: processing"
#> [88] "DESCRIPTION:The structure of transport data, Lecture, taught by: Dr Richard Connors"
#> [89] "DTSTART:20190319T123000"
#> [90] "DTEND:20190319T133000"
#> [91] "LOCATION:EC Stoner SR (7.76)"
#> [92] "UID:structure Lecture"
#> [93] "END:VEVENT"
#> [94] "BEGIN:VEVENT"
#> [95] "SUMMARY:TDS Practical: processing"
#> [96] "DESCRIPTION:Machine learning, Practical, taught by: Dr Robin Lovelace"
#> [97] "DTSTART:20190319T140000"
#> [98] "DTEND:20190319T153000"
#> [99] "LOCATION:West Teaching Lab Cluster (G.29)"
#> [100] "UID:ml Practical"
#> [101] "END:VEVENT"
#> [102] "BEGIN:VEVENT"
#> [103] "SUMMARY:TDS Lecture: viz"
#> [104] "DESCRIPTION:Data cleaning and subsetting, Lecture, taught by: Dr Robin Lovelace"
#> [105] "DTSTART:20190326T123000"
#> [106] "DTEND:20190326T133000"
#> [107] "LOCATION:EC Stoner SR (7.76)"
#> [108] "UID:cleaning Lecture"
#> [109] "END:VEVENT"
#> [110] "BEGIN:VEVENT"
#> [111] "SUMMARY:TDS Practical: viz"
#> [112] "DESCRIPTION:Project work, Practical, taught by: Dr Richard Connors"
#> [113] "DTSTART:20190326T140000"
#> [114] "DTEND:20190326T153000"
#> [115] "LOCATION:West Teaching Lab Cluster (G.29)"
#> [116] "UID:project Practical"
#> [117] "END:VEVENT"
#> [118] "BEGIN:VEVENT"
#> [119] "SUMMARY:TDS Lecture: ml"
#> [120] "DESCRIPTION:Data cleaning and subsetting, Lecture, taught by: Dr Robin Lovelace"
#> [121] "DTSTART:20190430T123000"
#> [122] "DTEND:20190430T133000"
#> [123] "LOCATION:EC Stoner SR (7.76)"
#> [124] "UID:cleaning Lecture"
#> [125] "END:VEVENT"
#> [126] "BEGIN:VEVENT"
#> [127] "SUMMARY:TDS Practical: ml"
#> [128] "DESCRIPTION:Project work, Practical, taught by: Dr Richard Connors"
#> [129] "DTSTART:20190430T140000"
#> [130] "DTEND:20190430T153000"
#> [131] "LOCATION:West Teaching Lab Cluster (G.29)"
#> [132] "UID:project Practical"
#> [133] "END:VEVENT"
#> [134] "BEGIN:VEVENT"
#> [135] "SUMMARY:TDS Lecture: project"
#> [136] "DESCRIPTION:Accessing data from web sources, Lecture, taught by: Dr Robin Lovelace"
#> [137] "DTSTART:20190507T123000"
#> [138] "DTEND:20190507T133000"
#> [139] "LOCATION:EC Stoner SR (7.76)"
#> [140] "UID:accessing Lecture"
#> [141] "END:VEVENT"
#> [142] "BEGIN:VEVENT"
#> [143] "SUMMARY:TDS Practical: project"
#> [144] "DESCRIPTION:Professional issues, Practical, taught by: Dr Robin Lovelace"
#> [145] "DTSTART:20190507T140000"
#> [146] "DTEND:20190507T153000"
#> [147] "LOCATION:West Teaching Lab Cluster (G.29)"
#> [148] "UID:prof Practical"
#> [149] "END:VEVENT"
#> [150] "BEGIN:VEVENT"
#> [151] "SUMMARY:TDS Lecture: prof"
#> [152] "DESCRIPTION:Accessing data from web sources, Lecture, taught by: Dr Robin Lovelace"
#> [153] "DTSTART:20190514T123000"
#> [154] "DTEND:20190514T133000"
#> [155] "LOCATION:EC Stoner SR (7.76)"
#> [156] "UID:accessing Lecture"
#> [157] "END:VEVENT"
#> [158] "BEGIN:VEVENT"
#> [159] "SUMMARY:TDS Practical: prof"
#> [160] "DESCRIPTION:Professional issues, Practical, taught by: Dr Robin Lovelace"
#> [161] "DTSTART:20190514T140000"
#> [162] "DTEND:20190514T153000"
#> [163] "LOCATION:West Teaching Lab Cluster (G.29)"
#> [164] "UID:prof Practical"
#> [165] "END:VEVENT"
#> [166] "END:VCALENDAR"
Created on 2019-01-28 by the reprex package (v0.2.1)
Session info
devtools::session_info()
#> ─ Session info ──────────────────────────────────────────────────────────
#> setting value
#> version R version 3.5.1 (2018-07-02)
#> os Debian GNU/Linux 9 (stretch)
#> system x86_64, linux-gnu
#> ui X11
#> language (EN)
#> collate en_US.UTF-8
#> ctype en_US.UTF-8
#> tz Etc/UTC
#> date 2019-01-28
#>
#> ─ Packages ──────────────────────────────────────────────────────────────
#> package * version date lib
#> assertthat 0.2.0 2017-04-11 [1]
#> backports 1.1.2 2017-12-13 [1]
#> base64enc 0.1-3 2015-07-28 [1]
#> bindr 0.1.1 2018-03-13 [1]
#> bindrcpp * 0.2.2 2018-03-29 [1]
#> calendar 0.0.0.9000 2019-01-28 [1]
#> callr 3.0.0 2018-08-24 [1]
#> cli 1.0.1 2018-09-25 [1]
#> crayon 1.3.4 2017-09-16 [1]
#> curl 3.2 2018-03-28 [1]
#> desc 1.2.0 2018-05-01 [1]
#> devtools 2.0.1 2018-10-26 [1]
#> digest 0.6.18 2018-10-10 [1]
#> dplyr 0.7.8 2018-11-10 [1]
#> evaluate 0.12 2018-10-09 [1]
#> fansi 0.4.0 2018-10-05 [1]
#> fs 1.2.6 2018-08-23 [1]
#> glue 1.3.0 2018-07-17 [1]
#> hms 0.4.2 2018-03-10 [1]
#> htmltools 0.3.6 2017-04-28 [1]
#> httr 1.3.1 2017-08-20 [1]
#> knitr 1.20 2018-02-20 [1]
#> lubridate 1.7.4 2018-04-11 [1]
#> magrittr 1.5 2014-11-22 [1]
#> memoise 1.1.0 2017-04-21 [1]
#> pillar 1.3.0 2018-07-14 [1]
#> pkgbuild 1.0.2 2018-10-16 [1]
#> pkgconfig 2.0.2 2018-08-16 [1]
#> pkgload 1.0.2 2018-10-29 [1]
#> prettyunits 1.0.2 2015-07-13 [1]
#> processx 3.2.1 2018-12-05 [1]
#> ps 1.2.1 2018-11-06 [1]
#> purrr 0.2.5 2018-05-29 [1]
#> R6 2.3.0 2018-10-04 [1]
#> Rcpp 1.0.0 2018-11-07 [1]
#> readr 1.2.1 2018-11-22 [1]
#> remotes 2.0.2 2018-10-30 [1]
#> rlang 0.3.0.1 2018-10-25 [1]
#> rmarkdown 1.10 2018-06-11 [1]
#> rprojroot 1.3-2 2018-01-03 [1]
#> rvest * 0.3.2 2016-06-17 [1]
#> selectr 0.4-1 2018-04-06 [1]
#> sessioninfo 1.1.1 2018-11-05 [1]
#> stringi 1.2.4 2018-07-20 [1]
#> stringr 1.3.1 2018-05-10 [1]
#> testthat 2.0.1 2018-10-13 [1]
#> tibble 1.4.2 2018-01-22 [1]
#> tidyselect 0.2.5 2018-10-11 [1]
#> usethis 1.4.0 2018-08-14 [1]
#> utf8 1.1.4 2018-05-24 [1]
#> withr 2.1.2 2018-03-15 [1]
#> xml2 * 1.2.0 2018-01-24 [1]
#> yaml 2.2.0 2018-07-25 [1]
#> source
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#> Github (ATFutures/calendar@4efa5ba)
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#> CRAN (R 3.5.1)
#>
#> [1] /usr/local/lib/R/site-library
#> [2] /usr/local/lib/R/library
Great work.
And... It works - try opening this: https://github.com/ITSLeeds/TDS/releases/download/0.1/tds-timetable.ics @layik
Yep confirmed!
Reproduction:
Download above tds-timetable.ics
file from the link above.
Open your Outlook Calendar
Create new calendar (to separate it from your calendar)
Add calendar > from file
Save!