## ----include = FALSE---------------------------------------------------------- knitr::opts_chunk$set( collapse = TRUE, comment = "#>", eval = identical(tolower(Sys.getenv("NOT_CRAN")), "true"), out.width = "100%" ) ## ----message = FALSE---------------------------------------------------------- # options(java.parameters = "-Xmx2G") # # library(r5r) # library(sf) # library(data.table) # library(ggplot2) # library(patchwork) # library(dplyr) # library(h3jsr) ## ----------------------------------------------------------------------------- # # setup and load Porto Alegre multimodal network into memory # # # system.file returns the directory with example data inside the r5r package # # set data path to directory containing your own data if not using the examples # data_path <- system.file("extdata/poa", package = "r5r") # # r5r_core <- setup_r5(data_path) # # # load transit network as an SF # transit_network <- transit_network_to_sf(r5r_core) # # # map # ggplot() + # geom_sf(data=transit_network$routes, aes(color=mode)) + # theme_void() ## ----------------------------------------------------------------------------- # fare_structure <- setup_fare_structure(r5r_core, # base_fare = 4.8, # by = "MODE") ## ----------------------------------------------------------------------------- # head(fare_structure, n=7) # ## ----------------------------------------------------------------------------- # fare_structure$max_discounted_transfers # fare_structure$transfer_time_allowance <- 60 # update transfer_time_allowance # fare_structure$fare_cap ## ----------------------------------------------------------------------------- # fare_structure$fares_per_type ## ----------------------------------------------------------------------------- # fare_structure$fares_per_type[type == "RAIL", unlimited_transfers := TRUE] # fare_structure$fares_per_type[type == "RAIL", fare := 4.50] # fare_structure$fares_per_type[type == "RAIL", allow_same_route_transfer := TRUE] ## ----------------------------------------------------------------------------- # fare_structure$fares_per_type ## ----------------------------------------------------------------------------- # fare_structure$fares_per_transfer ## ----------------------------------------------------------------------------- # # conditional update fare value # fare_structure$fares_per_transfer[first_leg == "BUS" & second_leg == "BUS", fare := 7.2] ## ----------------------------------------------------------------------------- # # conditional update fare value # fare_structure$fares_per_transfer[first_leg != second_leg, fare := 8.37] # # # use fcase instead ? # fare_structure$fares_per_transfer[, fare := fcase(first_leg == "BUS" & second_leg == "BUS", 7.2, # first_leg != second_leg, 8.37)] # ## ----------------------------------------------------------------------------- # # remove row # fare_structure$fares_per_transfer <- fare_structure$fares_per_transfer[!(first_leg == "RAIL" & second_leg == "RAIL")] # ## ----------------------------------------------------------------------------- # fare_structure$fares_per_transfer ## ----------------------------------------------------------------------------- # tail(fare_structure$fares_per_route) ## ----------------------------------------------------------------------------- # ## load input data # points <- read.csv(system.file("extdata/poa/poa_hexgrid.csv", package = "r5r")) # # # calculate travel times function # calculate_travel_times <- function(fare) { # ttm_df <- travel_time_matrix( # r5r_core, # origins = points, # destinations = points, # mode = c("WALK", "TRANSIT"), # departure_datetime = as.POSIXct( # "13-05-2019 14:00:00", # format = "%d-%m-%Y %H:%M:%S" # ), # time_window = 1, # fare_structure = fare_structure, # max_fare = fare, # max_trip_duration = 40, # max_walk_time = 20 # ) # # return(ttm_df) # } # # # # calculate travel times, and combine results # ttm <- calculate_travel_times(fare = Inf) # ttm_500 <- calculate_travel_times(fare = 5) # # # merge results # ttm[ttm_500, on = .(from_id, to_id), travel_time_500 := i.travel_time_p50] # ttm[, travel_time_unl := travel_time_p50] # ttm[, travel_time_p50 := NULL] ## ----------------------------------------------------------------------------- # tail(ttm, 10) ## ----------------------------------------------------------------------------- # # plot of overall travel time differences between limited and unlimited cost travel time matrices # time_difference = ttm[!is.na(travel_time_500), .(count = .N), # by = .(travel_time_unl, travel_time_500)] # # p1 <- ggplot(time_difference, aes(y = travel_time_unl, x = travel_time_500)) + # geom_point(size = 0.7) + # coord_fixed() + # scale_x_continuous(breaks = seq(0, 45, 5)) + # scale_y_continuous(breaks = seq(0, 45, 5)) + # theme_light() + # theme(legend.position = "none") + # labs(y = "travel time (minutes)\nunestricted monetary cost", # x = "travel time (minutes)\nmonetary cost restricted to BRL 5.00" # ) # # # plot of unreachable destinations when the monetary cost limit is too low # unreachable <- ttm[, .(count = .N), by = .(travel_time_unl, is.na(travel_time_500))] # unreachable[, perc := count / sum(count, na.rm = T), by = .(travel_time_unl)] # unreachable <- unreachable[is.na == TRUE] # unreachable <- na.omit(unreachable) # # p2 <- ggplot(unreachable, aes(x=travel_time_unl, y=perc)) + # geom_col() + # coord_flip() + # scale_x_continuous(breaks = seq(0, 45, 5)) + # scale_y_continuous(limits = c(0, 1), breaks = seq(0, 1, 0.2), # labels = paste0(seq(0, 100, 20), "%")) + # theme_light() + # labs(x = "travel time (minutes)\nwithout monetary cost restriction", # y = "% of unreachable destinations\nconsidering a R$ 5.00 monetary cost limit") # # # combine both plots using patchwork # p1 + p2 + plot_annotation(subtitle = "Comparing travel times with and without monetary cost restriction") # ## ----------------------------------------------------------------------------- # # calculate accessibility function # calculate_accessibility <- function(fare, fare_string) { # access_df <- accessibility( # r5r_core, # origins = points, # destinations = points, # mode = c("WALK", "TRANSIT"), # departure_datetime = as.POSIXct( # "13-05-2019 14:00:00", # format = "%d-%m-%Y %H:%M:%S" # ), # time_window = 1, # opportunities_colname = "healthcare", # cutoffs = 40, # fare_structure = fare_structure, # max_fare = fare, # max_trip_duration = 40, # max_walk_time = 20, # progress = FALSE) # # access_df$max_fare <- fare_string # # return(access_df) # } # # # calculate accessibility, combine results, and convert to SF # access_500 <- calculate_accessibility(fare=5, fare_string="R$ 5.00 budget") # access_unl <- calculate_accessibility(fare=Inf, fare_string="Unlimited budget") # # access <- rbind(access_500, access_unl) # # # bring geometry # access$geometry <- h3jsr::cell_to_polygon(access$id) # access <- st_as_sf(access) # ## ----------------------------------------------------------------------------- # # plot accessibility maps # ggplot(data = access) + # geom_sf(aes(fill = accessibility), color=NA, size = 0.2) + # scale_fill_distiller(palette = "Spectral") + # facet_wrap(~max_fare) + # labs(subtitle = "Effect of monetary cost on accessibility") + # theme_minimal() + # theme(legend.position = "bottom", # axis.text = element_blank()) # ## ----message = FALSE---------------------------------------------------------- # r5r::stop_r5(r5r_core) # rJava::.jgc(R.gc = TRUE)