From dca161caa131ef3aa85d601e48a5f429985b7449 Mon Sep 17 00:00:00 2001 From: Philip Bulsink Date: Mon, 14 Apr 2025 19:21:30 -0400 Subject: [PATCH 1/5] Avoid pick_driver deprecation fixes #282 --- R/load_driver_telemetry.R | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/R/load_driver_telemetry.R b/R/load_driver_telemetry.R index 9dcc557..68bf743 100644 --- a/R/load_driver_telemetry.R +++ b/R/load_driver_telemetry.R @@ -68,15 +68,15 @@ load_driver_telemetry <- function(season = get_current_season(), round = 1, sess } if (laps == "fastest") { - reticulate::py_run_string(glue::glue("tel = session.laps.pick_driver('{driver}').pick_fastest().get_telemetry().add_distance().add_driver_ahead()", + reticulate::py_run_string(glue::glue("tel = session.laps.pick_drivers('{driver}').pick_fastest().get_telemetry().add_distance().add_driver_ahead()", driver = driver )) } else if (laps != "all") { - reticulate::py_run_string(glue::glue("tel = session.laps.pick_driver('{driver}').pick_lap({laps}).get_telemetry().add_distance().add_driver_ahead()", + reticulate::py_run_string(glue::glue("tel = session.laps.pick_drivers('{driver}').pick_lap({laps}).get_telemetry().add_distance().add_driver_ahead()", driver = driver, laps = laps )) } else { - reticulate::py_run_string(glue::glue("tel = session.laps.pick_driver('{driver}').get_telemetry().add_distance().add_driver_ahead()", + reticulate::py_run_string(glue::glue("tel = session.laps.pick_drivers('{driver}').get_telemetry().add_distance().add_driver_ahead()", driver = driver )) } From d2ccd1a85901c4c6ba90b778abd1c8490055d83e Mon Sep 17 00:00:00 2001 From: Philip Bulsink Date: Mon, 14 Apr 2025 19:38:53 -0400 Subject: [PATCH 2/5] Update load_sprint to handle Jolpica changes fixes #281 --- R/load_sprint.R | 73 ++++++++++++++++++++++++++++++++++--------------- 1 file changed, 51 insertions(+), 22 deletions(-) diff --git a/R/load_sprint.R b/R/load_sprint.R index 714c84a..91c44f0 100644 --- a/R/load_sprint.R +++ b/R/load_sprint.R @@ -15,11 +15,15 @@ #' or NULL if no sprint exists for this season/round combo load_sprint <- function(season = get_current_season(), round = "last") { if (season != "current" && (season < 2021 || season > get_current_season())) { - cli::cli_abort('{.var season} must be between 2021 and {get_current_season()} (or use "current")') + cli::cli_abort( + '{.var season} must be between 2021 and {get_current_season()} (or use "current")' + ) } - url <- glue::glue("{season}/{round}/sprint.json?limit=40", - season = season, round = round + url <- glue::glue( + "{season}/{round}/sprint.json?limit=40", + season = season, + round = round ) data <- get_jolpica_content(url) @@ -29,15 +33,17 @@ load_sprint <- function(season = get_current_season(), round = "last") { } if (length(data$MRData$RaceTable$Races) == 0) { - cli::cli_alert_warning(glue::glue("No Sprint data for season = {season}, round = {round}", - season = season, round = round + cli::cli_alert_warning(glue::glue( + "No Sprint data for season = {season}, round = {round}", + season = season, + round = round )) return(NULL) } data <- data$MRData$RaceTable$Races$SprintResults[[1]] - data %>% + data <- data %>% tidyr::unnest( cols = c("Driver", "Constructor", "Time", "FastestLap"), names_repair = "universal" @@ -45,22 +51,45 @@ load_sprint <- function(season = get_current_season(), round = "last") { tidyr::unnest( cols = c("Time"), names_repair = "universal" - ) %>% - suppressWarnings() %>% - suppressMessages() %>% - dplyr::select( - "driverId", - "constructorId", - "points", - "position", - "grid", - "laps", - "status", - "position", - gap = "time...21", - "lap", - fastest = "time...23" - ) %>% + ) + + if ("time...24" %in% names(data)) { + data <- data %>% + suppressWarnings() %>% + suppressMessages() %>% + dplyr::select( + "driverId", + "constructorId", + "points", + "position", + "grid", + "laps", + "status", + "position", + gap = "time...21", + "lap", + fastest = "time...24" + ) + } else { + data <- data %>% + suppressWarnings() %>% + suppressMessages() %>% + dplyr::select( + "driverId", + "constructorId", + "points", + "position", + "grid", + "laps", + "status", + "position", + gap = "time...21", + "lap", + fastest = "time...23" + ) + } + + data %>% dplyr::mutate(time_sec = time_to_sec(.data$fastest)) %>% tibble::as_tibble() %>% janitor::clean_names() From 4f14cde4bb34cb4889a165d9d89f9dcf6d7e9f1e Mon Sep 17 00:00:00 2001 From: Philip Bulsink Date: Mon, 14 Apr 2025 19:56:09 -0400 Subject: [PATCH 3/5] Update load_sprint testing to check both variations --- tests/testthat/test-load_sprint.R | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/testthat/test-load_sprint.R b/tests/testthat/test-load_sprint.R index 731902a..637a8ef 100644 --- a/tests/testthat/test-load_sprint.R +++ b/tests/testthat/test-load_sprint.R @@ -17,6 +17,12 @@ test_that("load_sprint works", { expect_equal(sprint_2021_10$driver_id[3], "bottas") expect_equal(sprint_2021_10$position[1], "1") + sprint_2025_2 <- load_sprint(2025, 2) + + expect_equal(nrow(sprint_2025_2), 20) + expect_equal(sprint_2025_2$driver_id[1], "hamilton") + expect_equal(sprint_2025_2$position[1], "1") + expect_error(load_sprint(3050, 2), "`season` must be between 2021 and *") # A sprint doesn't exist for season = 2021, round = 11 From 540aa2557758725b9762fa7c76a29c1062be5647 Mon Sep 17 00:00:00 2001 From: Philip Bulsink Date: Thu, 17 Apr 2025 21:41:46 -0400 Subject: [PATCH 4/5] Use `names_sep` in `tidyr::unnest()` --- .Rbuildignore | 1 + .gitignore | 1 + R/load_results.R | 81 ++++++++++++++++++++++++++++++++++++------------ R/load_sprint.R | 63 +++++++++++++------------------------ 4 files changed, 85 insertions(+), 61 deletions(-) diff --git a/.Rbuildignore b/.Rbuildignore index e38ca49..cd2ac50 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -19,3 +19,4 @@ ^CRAN-SUBMISSION$ ^\w*.pem$ ^revdep$ +cobertura.xml diff --git a/.gitignore b/.gitignore index 91ec27b..c9a6705 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ docs .RData /revdep/ Thumbs.db +cobertura.xml diff --git a/R/load_results.R b/R/load_results.R index b2e3080..23daca5 100644 --- a/R/load_results.R +++ b/R/load_results.R @@ -13,11 +13,15 @@ #' in seconds. load_results <- function(season = get_current_season(), round = "last") { if (season != "current" && (season < 1950 || season > get_current_season())) { - cli::cli_abort('{.var season} must be between 1950 and {get_current_season()} (or use "current")') + cli::cli_abort( + '{.var season} must be between 1950 and {get_current_season()} (or use "current")' + ) } - url <- glue::glue("{season}/{round}/results.json?limit=40", - season = season, round = round + url <- glue::glue( + "{season}/{round}/results.json?limit=40", + season = season, + round = round ) data <- get_jolpica_content(url) @@ -31,10 +35,23 @@ load_results <- function(season = get_current_season(), round = "last") { # all races from before 2004 will have no 'Fastest Lap' column, # but also 2021 round 12 (Belgian GP) where no racing laps were run data %>% - tidyr::unnest(cols = c("Driver", "Time", "Constructor"), names_repair = "universal") %>% + tidyr::unnest( + cols = c("Driver", "Time", "Constructor"), + names_sep = ".", + names_repair = "universal" + ) %>% suppressWarnings() %>% suppressMessages() %>% - dplyr::select("driverId", "constructorId", "position", "points", "grid":"status", gap = "time") %>% + dplyr::select( + "driverId" = "Driver.driverId", + "constructorId" = "Constructor.constructorId", + "points", + "position", + "grid", + "laps", + "status", + gap = "Time.time" + ) %>% dplyr::mutate( fastest_rank = NA_integer_, fastest = NA_character_, @@ -45,35 +62,61 @@ load_results <- function(season = get_current_season(), round = "last") { janitor::clean_names() } else if (!("AverageSpeed" %in% colnames(data$FastestLap))) { data %>% - tidyr::unnest(cols = c("Driver", "Constructor", "Time", "FastestLap"), names_repair = "universal") %>% - dplyr::select("driverId", "constructorId", "points", "position", "grid", "laps", "status", "time", "Time", "rank") %>% - tidyr::unnest(cols = "Time", names_repair = "universal") %>% + tidyr::unnest( + cols = c("Driver", "Constructor", "Time", "FastestLap"), + names_sep = ".", + names_repair = "universal" + ) %>% + tidyr::unnest( + cols = "FastestLap.Time", + names_sep = ".", + names_repair = "universal" + ) %>% suppressWarnings() %>% suppressMessages() %>% dplyr::mutate(top_speed_kph = NA_real_) %>% - dplyr::select("driverId", "constructorId", "points", "position", "grid", "laps", "status", gap = "time...8", fastest_rank = "rank", fastest = "time...9", top_speed_kph) %>% + dplyr::select( + "driverId" = "Driver.driverId", + "constructorId" = "Constructor.constructorId", + "points", + "position", + "grid", + "laps", + "status", + gap = "Time.time", + fastest_rank = "FastestLap.rank", + fastest = "FastestLap.Time.time", + top_speed_kph + ) %>% dplyr::mutate(time_sec = time_to_sec(.data$fastest)) %>% tibble::as_tibble() %>% janitor::clean_names() } else { data %>% - tidyr::unnest(cols = c("Driver", "Constructor", "Time", "FastestLap"), names_repair = "universal") %>% - dplyr::select("driverId", "points", "position", "grid":"AverageSpeed", "constructorId", "name") %>% tidyr::unnest( - cols = c("Time", "AverageSpeed"), + cols = c("Driver", "Constructor", "Time", "FastestLap"), + names_sep = ".", + names_repair = "universal" + ) %>% + tidyr::unnest( + cols = c("FastestLap.Time", "FastestLap.AverageSpeed"), + names_sep = ".", names_repair = "universal" ) %>% suppressWarnings() %>% suppressMessages() %>% dplyr::select( - "driverId", - "constructorId", - "points":"status", - gap = "time...8", - fastest_rank = "rank", + "driverId" = "Driver.driverId", + "constructorId" = "Constructor.constructorId", + "points", + "position", + "grid", "laps", - fastest = "time...11", - top_speed_kph = "speed", + "status", + gap = "Time.time", + fastest_rank = "FastestLap.rank", + fastest = "FastestLap.Time.time", + top_speed_kph = "FastestLap.AverageSpeed.speed", ) %>% dplyr::mutate(time_sec = time_to_sec(.data$fastest)) %>% tibble::as_tibble() %>% diff --git a/R/load_sprint.R b/R/load_sprint.R index 91c44f0..6aee729 100644 --- a/R/load_sprint.R +++ b/R/load_sprint.R @@ -46,50 +46,29 @@ load_sprint <- function(season = get_current_season(), round = "last") { data <- data %>% tidyr::unnest( cols = c("Driver", "Constructor", "Time", "FastestLap"), - names_repair = "universal" + names_repair = "universal", + names_sep = "." ) %>% tidyr::unnest( - cols = c("Time"), - names_repair = "universal" - ) - - if ("time...24" %in% names(data)) { - data <- data %>% - suppressWarnings() %>% - suppressMessages() %>% - dplyr::select( - "driverId", - "constructorId", - "points", - "position", - "grid", - "laps", - "status", - "position", - gap = "time...21", - "lap", - fastest = "time...24" - ) - } else { - data <- data %>% - suppressWarnings() %>% - suppressMessages() %>% - dplyr::select( - "driverId", - "constructorId", - "points", - "position", - "grid", - "laps", - "status", - "position", - gap = "time...21", - "lap", - fastest = "time...23" - ) - } - - data %>% + cols = c("FastestLap.Time"), + names_repair = "universal", + names_sep = "." + ) %>% + suppressWarnings() %>% + suppressMessages() %>% + dplyr::select( + "driverId" = "Driver.driverId", + "constructorId" = "Constructor.constructorId", + "points", + "position", + "grid", + "laps", + "status", + "position", + "gap" = "Time.time", + "lap" = "FastestLap.lap", + "fastest" = "FastestLap.Time.time" + ) %>% dplyr::mutate(time_sec = time_to_sec(.data$fastest)) %>% tibble::as_tibble() %>% janitor::clean_names() From f09f2bef0676e14828a590c2f08dcb97ea7152f5 Mon Sep 17 00:00:00 2001 From: pbulsink Date: Fri, 18 Apr 2025 01:45:06 +0000 Subject: [PATCH 5/5] Style & Document code --- R/load_results.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/load_results.R b/R/load_results.R index 23daca5..803864d 100644 --- a/R/load_results.R +++ b/R/load_results.R @@ -47,7 +47,7 @@ load_results <- function(season = get_current_season(), round = "last") { "constructorId" = "Constructor.constructorId", "points", "position", - "grid", + "grid", "laps", "status", gap = "Time.time"