local({ previous_options <- options(warn = 2, digits = 8, stringsAsFactors = FALSE) on.exit(options(previous_options), add = TRUE) check_counts <- function(x, allow_missing = FALSE, allow_empty = FALSE) { if (!(is.integer(x) || is.double(x)) || is.object(x) || !is.null(dim(x))) { stop("Use a plain numeric vector") } if (length(x) > 256L || (!allow_empty && length(x) == 0L)) { stop("Use 1..256 counts unless empty input is explicitly allowed") } if (any(is.nan(x)) || (!allow_missing && anyNA(x))) { stop("Missing or undefined counts are not allowed here") } observed <- x[!is.na(x)] if (any(!is.finite(observed)) || any(observed < 0) || any(observed > 1000000) || any(observed != floor(observed))) { stop("Counts must be finite whole numbers from 0 to 1000000") } invisible(x) } new_room_report <- function(rooms, totals) { check_counts(totals, allow_empty = TRUE) if (!is.character(rooms) || anyNA(rooms) || any(!nzchar(trimws(rooms))) || anyDuplicated(rooms) || length(rooms) != length(totals)) { stop("Use one unique non-empty room name per total") } structure(list(room = rooms, total = as.numeric(totals)), class = "room_report") } print.room_report <- function(x, ...) { cat("rooms:", length(x$room), "total visits:", sum(x$total), "\n") invisible(x) } report <- new_room_report(c("East", "West"), c(18, 26)) print(report) invisible(NULL) })