From 29b17255a88d96fbfc292537f6d8a71c8a920869 Mon Sep 17 00:00:00 2001 From: Rainer Hirk Date: Fri, 12 Jun 2026 12:39:02 +0200 Subject: [PATCH 1/2] add tests for mulitple backtransform --- inst/tinytest/test_backtransform.R | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/inst/tinytest/test_backtransform.R b/inst/tinytest/test_backtransform.R index 9d717a1..32959bc 100644 --- a/inst/tinytest/test_backtransform.R +++ b/inst/tinytest/test_backtransform.R @@ -55,6 +55,16 @@ tf <- as.trackframe(data = sftrack_a) sftrack_b <- tf_backtransform(tf) expect_equal(sftrack_b, sftrack_a) +tf2 <- as.trackframe(tf, coerce_to = "data.table") +expect_equal(tf_backtransform(tf2), tf) + +expect_equal(tf_backtransform(tf_backtransform(tf2)), sftrack_a) + +expect_equal( + tf_backtransform(tf_backtransform(tf2)), + tf_backtransform(tf2, all = TRUE) +) + # test with multiple ids data("raccoon", package = "sftrack") raccoon$month <- as.POSIXlt(raccoon$timestamp)$mon + 1 From 015f129579014991e5be53a746983e24773f610f Mon Sep 17 00:00:00 2001 From: Brock Date: Fri, 12 Jun 2026 12:39:21 +0200 Subject: [PATCH 2/2] tf_backtransform only undo one as.trackframe --- R/backtransform.R | 12 ++++++++---- R/trackframe.R | 7 +++++-- man/tf_backtransform.Rd | 7 +++++-- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/R/backtransform.R b/R/backtransform.R index b2766f7..27f5c8b 100644 --- a/R/backtransform.R +++ b/R/backtransform.R @@ -19,7 +19,11 @@ backtransform_id <- function(unique_id, group_names) { #' Backtransform #' +#' Undoes as.trackframe, returning the dataframe to its previous class. +#' Also attempts to undo sorting performed by as.trackframe. +#' #' @param tf an object of class `trackframe` +#' @param all undo all as.trackframe calls, not just the most recent #' #' @return an object which has been coerced to `trackframe` #' @export @@ -43,7 +47,7 @@ backtransform_id <- function(unique_id, group_names) { #' tfb <- tf_backtransform(tf) #' tfb #' df_mini -tf_backtransform <- function(tf) { +tf_backtransform <- function(tf, all = FALSE) { assert_class(tf, "trackframe") transformation_info <- attr(tf, "transformation_info") if (is.null(transformation_info)) { @@ -63,9 +67,6 @@ tf_backtransform <- function(tf) { attr(tf_bt, "class") <- class_old attributes(tf_bt)[!names(attributes(tf_bt)) %in% names(transformation_info)] <- NULL } else if (class_old[1] %in% c("trackframe", "data.frame", "data.table", "tbl_df", "tbl")) { - if (isTRUE(sort)) { - tf <- sort(tf) - } if (isTRUE(attr(tf, "easting") != transformation_info$coord_names[1])) { tf[, attr(tf, "easting")] <- NULL } @@ -150,6 +151,9 @@ tf_backtransform <- function(tf) { if (reorder) { tf_bt <- tf_bt[match(orig_hash, new_hash), ] } + if (all && !is.null(transformation_info$attributes$transformation_info)) { + tf_bt <- tf_backtransform(tf_bt, all = TRUE) + } return(tf_bt) } diff --git a/R/trackframe.R b/R/trackframe.R index 88fc470..77ed203 100644 --- a/R/trackframe.R +++ b/R/trackframe.R @@ -353,13 +353,16 @@ as.trackframe.data.frame <- function( log_debug("- %i set as crs", attr(data, "crs")) log_debug("- %i set as crs_type", attr(data, "crs_type")) - if (is.null(attr(data, "transformation_info"))) { + if (is.null(attr(data, "tmp_transformation_info"))) { transformation_info <- list() transformation_info$attributes <- attributes_input transformation_info$class <- attributes_input$class transformation_info$names <- cn_input transformation_info$coord_names <- c(easting_col, northing_col) attr(data, "transformation_info") <- transformation_info + } else { + attr(data, "transformation_info") <- attr(data, "tmp_transformation_info") + attr(data, "tmp_transformation_info") <- NULL } # sort data by id and time @@ -641,7 +644,7 @@ as.trackframe.sf <- function( } attr(data, "row.names") <- data_attr[["row.names"]] - attr(data, "transformation_info") <- transformation_info + attr(data, "tmp_transformation_info") <- transformation_info as.trackframe( data, time_col = time_col, diff --git a/man/tf_backtransform.Rd b/man/tf_backtransform.Rd index 910e160..60a0d22 100644 --- a/man/tf_backtransform.Rd +++ b/man/tf_backtransform.Rd @@ -4,16 +4,19 @@ \alias{tf_backtransform} \title{Backtransform} \usage{ -tf_backtransform(tf) +tf_backtransform(tf, all = FALSE) } \arguments{ \item{tf}{an object of class \code{trackframe}} + +\item{all}{undo all as.trackframe calls, not just the most recent} } \value{ an object which has been coerced to \code{trackframe} } \description{ -Backtransform +Undoes as.trackframe, returning the dataframe to its previous class. +Also attempts to undo sorting performed by as.trackframe. } \examples{ library(trackframe)