From 70911bbb841482f7e3b29d8731d1920ae0a318ab Mon Sep 17 00:00:00 2001 From: Dereck Mezquita Date: Fri, 26 Jul 2024 21:00:51 -0500 Subject: [PATCH] Working typed data.frames. --- R/type.frame.R | 11 +++++++---- R/validate_property.R | 9 +++++++-- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/R/type.frame.R b/R/type.frame.R index d0127ec..57419d8 100644 --- a/R/type.frame.R +++ b/R/type.frame.R @@ -2,13 +2,13 @@ #' #' @param frame The base data structure (e.g., data.frame, data.table) #' @param col_types A list of column types and validators -#' @param freeze_n_cols Logical, whether to freeze the number of columns (default: FALSE) +#' @param freeze_n_cols Logical, whether to freeze the number of columns (default: TRUE) #' @param row_validator A function to validate each row (optional) #' @param allow_na Logical, whether to allow NA values (default: TRUE) #' @param on_violation Action to take on violation: "error", "warning", or "silent" (default: "error") #' @return A function that creates typed data frames #' @export -type.frame <- function(frame, col_types, freeze_n_cols = FALSE, +type.frame <- function(frame, col_types, freeze_n_cols = TRUE, row_validator = NULL, allow_na = TRUE, on_violation = c("error", "warning", "silent")) { on_violation <- match.arg(on_violation) @@ -38,7 +38,11 @@ type.frame <- function(frame, col_types, freeze_n_cols = FALSE, # Validate rows if (!is.null(row_validator)) { - invalid_rows <- which(!apply(df, 1, row_validator)) + invalid_rows <- which(!apply(df, 1, function(row) { + row_df <- as.data.frame(t(row)) + names(row_df) <- names(df) + row_validator(row_df) + })) if (length(invalid_rows) > 0) { handle_violation(sprintf("Invalid rows: %s", paste(invalid_rows, collapse = ", ")), on_violation) } @@ -58,7 +62,6 @@ type.frame <- function(frame, col_types, freeze_n_cols = FALSE, return(creator) } - #' Handle violations based on the specified action #' #' @param message The error message diff --git a/R/validate_property.R b/R/validate_property.R index a9da79f..797ac18 100644 --- a/R/validate_property.R +++ b/R/validate_property.R @@ -39,8 +39,13 @@ validate_property <- function(name, value, validator) { if (!data.table::is.data.table(value)) { return(sprintf("Property '%s' must be a data.table", name)) } - } else if (!validator(value)) { - return(sprintf("Invalid value for property '%s'", name)) + } else { + # Custom validator function + validation_result <- vapply(value, validator, logical(1)) + if (!all(validation_result)) { + invalid_indices <- which(!validation_result) + return(sprintf("Invalid value(s) for property '%s' at index(es): %s", name, paste(invalid_indices, collapse = ", "))) + } } } else if (is.character(validator)) { if (!inherits(value, validator)) {