From d2b8ec1e713ae0ed35558c64c23d48124a2ce1cb Mon Sep 17 00:00:00 2001 From: Alex Magnus Date: Sun, 8 Feb 2026 14:09:06 +0100 Subject: [PATCH 1/2] feat(null-default-departure-time) Change the default departure time from Sys.time() to null to avoid silent errors with transit trips #486 --- r-package/R/accessibility.R | 4 ++-- r-package/R/arrival_travel_time_matrix.R | 7 ++++++- r-package/R/assign.R | 11 ++++++++++- r-package/R/detailed_itineraries.R | 4 ++-- r-package/R/expanded_travel_time_matrix.R | 4 ++-- r-package/R/isochrone.R | 2 +- r-package/R/pareto_frontier.R | 4 ++-- r-package/R/travel_time_matrix.R | 4 ++-- 8 files changed, 27 insertions(+), 13 deletions(-) diff --git a/r-package/R/accessibility.R b/r-package/R/accessibility.R index 7e755c9f4..ad85b5344 100644 --- a/r-package/R/accessibility.R +++ b/r-package/R/accessibility.R @@ -128,7 +128,7 @@ accessibility <- function(r5r_network, opportunities_colnames = "opportunities", mode = "WALK", mode_egress = "WALK", - departure_datetime = Sys.time(), + departure_datetime = NULL, time_window = 10L, percentiles = 50L, decay_function = "step", @@ -179,7 +179,7 @@ accessibility <- function(r5r_network, destinations <- assign_points_input(destinations, "destinations") opportunities <- assign_opportunities(destinations, opportunities_colnames) mode_list <- assign_mode(mode, mode_egress) - departure <- assign_departure(departure_datetime) + departure <- assign_departure(departure_datetime, mode_list) # check availability of transit services on the selected date if (mode_list$transit_mode %like% 'TRANSIT|TRAM|SUBWAY|RAIL|BUS|CABLE_CAR|GONDOLA|FUNICULAR') { diff --git a/r-package/R/arrival_travel_time_matrix.R b/r-package/R/arrival_travel_time_matrix.R index 012028aaf..501a8155d 100644 --- a/r-package/R/arrival_travel_time_matrix.R +++ b/r-package/R/arrival_travel_time_matrix.R @@ -86,7 +86,7 @@ arrival_travel_time_matrix <- function(r5r_network, destinations, mode = "WALK", mode_egress = "WALK", - arrival_datetime = Sys.time(), + arrival_datetime, breakdown = FALSE, max_walk_time = Inf, max_bike_time = Inf, @@ -133,6 +133,11 @@ arrival_travel_time_matrix <- function(r5r_network, mode_list <- assign_mode(mode, mode_egress) # calculate departure datetime + checkmate::assert( + !is.null(arrival_datetime), + .var.name = "arrival_datetime", + msg = "You must pass an arrival_datetime to use arrival_travel_time_matrix" + ) departure_datetime <- arrival_datetime - as.difftime(max_trip_duration, units = "mins") departure <- assign_departure(departure_datetime) diff --git a/r-package/R/assign.R b/r-package/R/assign.R index 150ad33d1..4923986ce 100644 --- a/r-package/R/assign.R +++ b/r-package/R/assign.R @@ -142,7 +142,16 @@ assign_mode <- function(mode, mode_egress, style) { #' @family assigning functions #' #' @keywords internal -assign_departure <- function(datetime) { +assign_departure <- function(datetime, mode_list) { + if (is.null(datetime)) { + if (mode_list$transit_mode == "") { + datetime <- Sys.time() + } else { + stop("When using a transit mode you must pass a departure_datetime", call. = FALSE) + } + } + + checkmate::assert_posixct( datetime, len = 1, diff --git a/r-package/R/detailed_itineraries.R b/r-package/R/detailed_itineraries.R index 66c6ba281..30522e8e0 100644 --- a/r-package/R/detailed_itineraries.R +++ b/r-package/R/detailed_itineraries.R @@ -102,7 +102,7 @@ detailed_itineraries <- function(r5r_network, destinations, mode = "WALK", mode_egress = "WALK", - departure_datetime = Sys.time(), + departure_datetime = NULL, time_window = 10L, suboptimal_minutes = 0L, max_walk_time = Inf, @@ -157,7 +157,7 @@ detailed_itineraries <- function(r5r_network, destinations <- od_list$destinations mode_list <- assign_mode(mode, mode_egress) - departure <- assign_departure(departure_datetime) + departure <- assign_departure(departure_datetime, mode_list) # check availability of transit services on the selected date if (mode_list$transit_mode %like% 'TRANSIT|TRAM|SUBWAY|RAIL|BUS|CABLE_CAR|GONDOLA|FUNICULAR') { diff --git a/r-package/R/expanded_travel_time_matrix.R b/r-package/R/expanded_travel_time_matrix.R index 4131ccbd2..f0bd6fa62 100644 --- a/r-package/R/expanded_travel_time_matrix.R +++ b/r-package/R/expanded_travel_time_matrix.R @@ -96,7 +96,7 @@ expanded_travel_time_matrix <- function(r5r_network, destinations, mode = "WALK", mode_egress = "WALK", - departure_datetime = Sys.time(), + departure_datetime = NULL, time_window = 10L, breakdown = FALSE, max_walk_time = Inf, @@ -140,7 +140,7 @@ expanded_travel_time_matrix <- function(r5r_network, origins <- assign_points_input(origins, "origins") destinations <- assign_points_input(destinations, "destinations") mode_list <- assign_mode(mode, mode_egress) - departure <- assign_departure(departure_datetime) + departure <- assign_departure(departure_datetime, mode_list) # check availability of transit services on the selected date if (mode_list$transit_mode %like% 'TRANSIT|TRAM|SUBWAY|RAIL|BUS|CABLE_CAR|GONDOLA|FUNICULAR') { diff --git a/r-package/R/isochrone.R b/r-package/R/isochrone.R index 9244f4b73..d7515d311 100644 --- a/r-package/R/isochrone.R +++ b/r-package/R/isochrone.R @@ -167,7 +167,7 @@ isochrone <- function(r5r_network, mode_egress = "walk", cutoffs = c(0, 15, 30), zoom = 10, - departure_datetime = Sys.time(), + departure_datetime = NULL, polygon_output = TRUE, time_window = 10L, max_walk_time = Inf, diff --git a/r-package/R/pareto_frontier.R b/r-package/R/pareto_frontier.R index 267122116..4c7f753ab 100644 --- a/r-package/R/pareto_frontier.R +++ b/r-package/R/pareto_frontier.R @@ -93,7 +93,7 @@ pareto_frontier <- function(r5r_network, destinations, mode = c("WALK", "TRANSIT"), mode_egress = "WALK", - departure_datetime = Sys.time(), + departure_datetime = NULL, time_window = 10L, percentiles = 50L, max_walk_time = Inf, @@ -135,7 +135,7 @@ pareto_frontier <- function(r5r_network, origins <- assign_points_input(origins, "origins") destinations <- assign_points_input(destinations, "destinations") mode_list <- assign_mode(mode, mode_egress) - departure <- assign_departure(departure_datetime) + departure <- assign_departure(departure_datetime, mode_list) # check availability of transit services on the selected date if (mode_list$transit_mode %like% 'TRANSIT|TRAM|SUBWAY|RAIL|BUS|CABLE_CAR|GONDOLA|FUNICULAR') { diff --git a/r-package/R/travel_time_matrix.R b/r-package/R/travel_time_matrix.R index 1d189275f..07424e19d 100644 --- a/r-package/R/travel_time_matrix.R +++ b/r-package/R/travel_time_matrix.R @@ -117,7 +117,7 @@ travel_time_matrix <- function(r5r_network, destinations, mode = "WALK", mode_egress = "WALK", - departure_datetime = Sys.time(), + departure_datetime = NULL, time_window = 10L, percentiles = 50L, max_walk_time = Inf, @@ -163,7 +163,7 @@ travel_time_matrix <- function(r5r_network, origins <- assign_points_input(origins, "origins") destinations <- assign_points_input(destinations, "destinations") mode_list <- assign_mode(mode, mode_egress) - departure <- assign_departure(departure_datetime) + departure <- assign_departure(departure_datetime, mode_list) # check availability of transit services on the selected date if (mode_list$transit_mode %like% 'TRANSIT|TRAM|SUBWAY|RAIL|BUS|CABLE_CAR|GONDOLA|FUNICULAR') { From 631f0f43ec04412d8931acd2ab8b6f95395ec110 Mon Sep 17 00:00:00 2001 From: Alex Magnus Date: Sun, 8 Feb 2026 14:10:57 +0100 Subject: [PATCH 2/2] chore: update documentation --- r-package/man/accessibility.Rd | 2 +- r-package/man/arrival_travel_time_matrix.Rd | 2 +- r-package/man/assign_departure.Rd | 2 +- r-package/man/detailed_itineraries.Rd | 2 +- r-package/man/expanded_travel_time_matrix.Rd | 2 +- r-package/man/isochrone.Rd | 2 +- r-package/man/pareto_frontier.Rd | 2 +- r-package/man/travel_time_matrix.Rd | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/r-package/man/accessibility.Rd b/r-package/man/accessibility.Rd index c5915c937..17062f939 100644 --- a/r-package/man/accessibility.Rd +++ b/r-package/man/accessibility.Rd @@ -12,7 +12,7 @@ accessibility( opportunities_colnames = "opportunities", mode = "WALK", mode_egress = "WALK", - departure_datetime = Sys.time(), + departure_datetime = NULL, time_window = 10L, percentiles = 50L, decay_function = "step", diff --git a/r-package/man/arrival_travel_time_matrix.Rd b/r-package/man/arrival_travel_time_matrix.Rd index c7b5b9fd7..6e737118e 100644 --- a/r-package/man/arrival_travel_time_matrix.Rd +++ b/r-package/man/arrival_travel_time_matrix.Rd @@ -12,7 +12,7 @@ arrival_travel_time_matrix( destinations, mode = "WALK", mode_egress = "WALK", - arrival_datetime = Sys.time(), + arrival_datetime, breakdown = FALSE, max_walk_time = Inf, max_bike_time = Inf, diff --git a/r-package/man/assign_departure.Rd b/r-package/man/assign_departure.Rd index 33af5ec12..a9ab30a2a 100644 --- a/r-package/man/assign_departure.Rd +++ b/r-package/man/assign_departure.Rd @@ -4,7 +4,7 @@ \alias{assign_departure} \title{Check and convert POSIXct objects to strings} \usage{ -assign_departure(datetime) +assign_departure(datetime, mode_list) } \arguments{ \item{datetime}{An object of POSIXct class.} diff --git a/r-package/man/detailed_itineraries.Rd b/r-package/man/detailed_itineraries.Rd index e110d9c23..3f5a116c0 100644 --- a/r-package/man/detailed_itineraries.Rd +++ b/r-package/man/detailed_itineraries.Rd @@ -11,7 +11,7 @@ detailed_itineraries( destinations, mode = "WALK", mode_egress = "WALK", - departure_datetime = Sys.time(), + departure_datetime = NULL, time_window = 10L, suboptimal_minutes = 0L, max_walk_time = Inf, diff --git a/r-package/man/expanded_travel_time_matrix.Rd b/r-package/man/expanded_travel_time_matrix.Rd index 79b58cef3..eeeea8dc6 100644 --- a/r-package/man/expanded_travel_time_matrix.Rd +++ b/r-package/man/expanded_travel_time_matrix.Rd @@ -11,7 +11,7 @@ expanded_travel_time_matrix( destinations, mode = "WALK", mode_egress = "WALK", - departure_datetime = Sys.time(), + departure_datetime = NULL, time_window = 10L, breakdown = FALSE, max_walk_time = Inf, diff --git a/r-package/man/isochrone.Rd b/r-package/man/isochrone.Rd index 544888be0..b3f90f402 100644 --- a/r-package/man/isochrone.Rd +++ b/r-package/man/isochrone.Rd @@ -12,7 +12,7 @@ isochrone( mode_egress = "walk", cutoffs = c(0, 15, 30), zoom = 10, - departure_datetime = Sys.time(), + departure_datetime = NULL, polygon_output = TRUE, time_window = 10L, max_walk_time = Inf, diff --git a/r-package/man/pareto_frontier.Rd b/r-package/man/pareto_frontier.Rd index fe9392726..4ad220941 100644 --- a/r-package/man/pareto_frontier.Rd +++ b/r-package/man/pareto_frontier.Rd @@ -11,7 +11,7 @@ pareto_frontier( destinations, mode = c("WALK", "TRANSIT"), mode_egress = "WALK", - departure_datetime = Sys.time(), + departure_datetime = NULL, time_window = 10L, percentiles = 50L, max_walk_time = Inf, diff --git a/r-package/man/travel_time_matrix.Rd b/r-package/man/travel_time_matrix.Rd index 2fd8876e4..8cd778006 100644 --- a/r-package/man/travel_time_matrix.Rd +++ b/r-package/man/travel_time_matrix.Rd @@ -12,7 +12,7 @@ travel_time_matrix( destinations, mode = "WALK", mode_egress = "WALK", - departure_datetime = Sys.time(), + departure_datetime = NULL, time_window = 10L, percentiles = 50L, max_walk_time = Inf,