composerr

GitHub last commit GitHub code size in bytes

composerr is an R package that helps building error handling functions which return meaningful error messages without doing copy/paste.

Installation

# Install development version from GitHub
devtools::install_github('R-package/composerr', build_opts = NULL)

Usage

Concatenating error messages

The functions composerr and composerr_parent allow the concatenation of a more detailed error message to an already existing error handler (wich already has a rather basic information).

library(composerr)

#' The cool function `foo()`
#'
#' Function with error handling
#' @param x Must be a list object of length 3.
foo <- function(x) {
  # create your general error handler
  err <- composerr("While calling `foo`")
  # modify the error handler to get a more detailed message
  err_x <- composerr("Invalid argument `x`", err)
  if (!is.list(x))
    err_x("Not a list object.")
  if (length(x) != 3)
    err_x("Not of length 3.")
  sum(unlist(x))
}

# call your function and
# get a meaningful error message
foo(list(1, 2, 3, 4))

Overriding error handlers in nested environments

The function composerr_parent looks up the existing error handler in the parent environment and not in the current environment. This can be useful in nested scoping situations (for example when checking if a nested list object has a valid structure) and if you want to store the nested error handler functions under the same name (overriding error handler functions).

#' The cool function `foo()`
#'
#' Function with error handling
#' @param x Must be a list object of length 3
#'   and all entries of `x` must be non-missing numbers.
foo <- function(x) {
  # add the period at the end of the error message automatically
  err <- composerr(
    text_1 = "While calling `foo`",
    text_2 = ".",
    sep_2 = ""
  )
  err_x <- composerr("Invalid argument `x`", err)
  if (!is.list(x))
    err_x("Not a list object")
  if (length(x) != 3)
    err_x("Not of length 3")
  sapply(seq_len(length(x)), function(i) {
    val <- x[[i]]
    # modify error handler inside of nested scope
    # and store it under the same name (`err_x`)
    err_x <- composerr_parent(
      paste0("List entry `", i, "`"),
      err_x
    )
    if (!is.numeric(val)) {
      err_x("Not a number")
    }
    if (is.na(val))
      err_x("Is `NA`")
  })
  sum(unlist(x))
}

# call your function and
# get a meaningful error message
foo(list(1, 2, NA))

License

GPL-3



R-package/composerr documentation built on Oct. 30, 2019, 10:46 p.m.