R/assert.R

Defines functions assert_named_list_of_data_frames assert_data_frame assert_character_vector new_assert_scalar assert_filter_exists assert_valid_id abort

abort <- function(...) {
  stop(..., call. = FALSE)
}

assert_valid_id <- function(id) {
  assert_character_scalar(id)
  if (!grepl("^[A-Z0-9]([A-Z0-9])*$", id)) {
    abort(
      "`id` may only contain uppercase letters and numbers."
    )
  }
}

assert_filter_exists <- function(id) {
  if (exists(id, envir = .filters, inherits = FALSE)) {
    abort(
      "Filter ", squote(id), " already exists. Set `overwrite = TRUE` ",
      "to force overwriting the existing filter definition."
    )
  }
}

new_assert_scalar <- function(predicate, type) {
  function(x) {
    if (length(x) != 1L || !predicate(x) || is.na(x)) {
      abort("`", substitute(x), "` must be a ", type, " scalar.")
    }
  }
}
assert_character_scalar <- new_assert_scalar(is.character, "character")
assert_logical_scalar <- new_assert_scalar(is.logical, "logical")

assert_character_vector <- function(x) {
  if (length(x) == 0L || !is.character(x) || any(is.na(x))) {
    abort(
      "`", deparse(substitute(x)), "` must be a character vector ",
      "containing no `NA` values."
    )
  }
}

assert_data_frame <- function(x) {
  if (!is.data.frame(x)) {
    abort( "`", substitute(x), "` must be a data.frame.")
  }
}

assert_named_list_of_data_frames <- function(x) {
  if (!is.list(x) ||
      is.null(names(x)) ||
      any(names(x) == "") ||
      any(map_bool(x, Negate(is.data.frame)))) {
    abort("`", substitute(x), "` must be a named list of data frames.")
  }
}

Try the filters package in your browser

Any scripts or data that you put into this service are public.

filters documentation built on May 29, 2024, 8:29 a.m.