From 0e698a36f358f840aa7031b883bc49afa7761537 Mon Sep 17 00:00:00 2001 From: Stefano Mezzini <42444204+StefanoMezzini@users.noreply.github.com> Date: Mon, 6 Jul 2026 11:05:18 -0700 Subject: [PATCH 1/2] created `chk_all_na()` --- NAMESPACE | 2 + R/chk-all-na.R | 50 +++++++++++++++++++++++++ man/chk_all_na.Rd | 63 ++++++++++++++++++++++++++++++++ man/chk_join.Rd | 1 + man/chk_not_any_na.Rd | 1 + man/chk_not_empty.Rd | 1 + man/chk_unique.Rd | 1 + tests/testthat/test-chk-all-na.R | 20 ++++++++++ vignettes/chk-families.Rmd | 7 ++++ 9 files changed, 146 insertions(+) create mode 100644 R/chk-all-na.R create mode 100644 man/chk_all_na.Rd create mode 100644 tests/testthat/test-chk-all-na.R diff --git a/NAMESPACE b/NAMESPACE index 0058410e..8ff83ca1 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -15,6 +15,7 @@ export(chk_all) export(chk_all_equal) export(chk_all_equivalent) export(chk_all_identical) +export(chk_all_na) export(chk_array) export(chk_atomic) export(chk_character) @@ -113,6 +114,7 @@ export(vld_all) export(vld_all_equal) export(vld_all_equivalent) export(vld_all_identical) +export(vld_all_na) export(vld_array) export(vld_atomic) export(vld_character) diff --git a/R/chk-all-na.R b/R/chk-all-na.R new file mode 100644 index 00000000..3e24b578 --- /dev/null +++ b/R/chk-all-na.R @@ -0,0 +1,50 @@ +#' Check All Missing Values +#' +#' @description +#' Checks if all missing values using +#' +#' `all(is.na(x))` +#' +#' **Pass**: `NA`, `c(NA, NA)`, `logical(0)`. +#' +#' **Fail**: `1`, `1:2`, `"1"`, `c(1, NA)`. +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family misc_checkers +#' +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_all_na +#' try(chk_all_na(1)) +#' try(chk_all_na(c(1, NA))) +#' chk_all_na(NA) +#' chk_all_na(c(NA, NA_character_, NA_real_)) +#' @export +chk_all_na <- function(x, x_name = NULL) { + if (vld_all_na(x)) { + return(invisible(x)) + } + if (is.null(x_name)) { + x_name <- deparse_backtick_chk((substitute(x))) + } + abort_chk(x_name, " must only have missing values", x = x) +} + +#' @describeIn chk_all_na Validate All Missing Values +#' +#' @examples +#' # vld_all_na +#' vld_all_na(1) +#' vld_all_na(1:2) +#' vld_all_na(NA_real_) +#' vld_all_na(integer(0)) +#' vld_all_na(c(NA, 1)) +#' vld_all_na(TRUE) +#' vld_all_na(c(NA_real_, NA_character_)) +#' @export +vld_all_na <- function(x) all(is.na(x)) diff --git a/man/chk_all_na.Rd b/man/chk_all_na.Rd new file mode 100644 index 00000000..20d94dc0 --- /dev/null +++ b/man/chk_all_na.Rd @@ -0,0 +1,63 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-all-na.R +\name{chk_all_na} +\alias{chk_all_na} +\alias{vld_all_na} +\title{Check All Missing Values} +\usage{ +chk_all_na(x, x_name = NULL) + +vld_all_na(x) +} +\arguments{ +\item{x}{The object to check.} + +\item{x_name}{A string of the name of object x or NULL.} +} +\value{ +The \code{chk_} function throws an informative error if the test fails or +returns the original object if successful so it can used in pipes. + +The \code{vld_} function returns a flag indicating whether the test was met. +} +\description{ +Checks if all missing values using + +\code{all(is.na(x))} + +\strong{Pass}: \code{NA}, \code{c(NA, NA)}, \code{logical(0)}. + +\strong{Fail}: \code{1}, \code{1:2}, \code{"1"}, \code{c(1, NA)}. +} +\section{Functions}{ +\itemize{ +\item \code{vld_all_na()}: Validate All Missing Values + +}} +\examples{ +# chk_all_na +try(chk_all_na(1)) +try(chk_all_na(c(1, NA))) +chk_all_na(NA) +chk_all_na(c(NA, NA_character_, NA_real_)) +# vld_all_na +vld_all_na(1) +vld_all_na(1:2) +vld_all_na(NA_real_) +vld_all_na(integer(0)) +vld_all_na(c(NA, 1)) +vld_all_na(TRUE) +vld_all_na(c(NA_real_, NA_character_)) +} +\seealso{ +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other misc_checkers: +\code{\link[=chk_join]{chk_join()}}, +\code{\link[=chk_not_any_na]{chk_not_any_na()}}, +\code{\link[=chk_not_empty]{chk_not_empty()}}, +\code{\link[=chk_unique]{chk_unique()}} +} +\concept{misc_checkers} diff --git a/man/chk_join.Rd b/man/chk_join.Rd index ceb49f95..caedfb4d 100644 --- a/man/chk_join.Rd +++ b/man/chk_join.Rd @@ -49,6 +49,7 @@ please read the article \code{vignette("chk-families")}. Other misc_checkers: +\code{\link[=chk_all_na]{chk_all_na()}}, \code{\link[=chk_not_any_na]{chk_not_any_na()}}, \code{\link[=chk_not_empty]{chk_not_empty()}}, \code{\link[=chk_unique]{chk_unique()}} diff --git a/man/chk_not_any_na.Rd b/man/chk_not_any_na.Rd index 50d31411..015e5e1a 100644 --- a/man/chk_not_any_na.Rd +++ b/man/chk_not_any_na.Rd @@ -52,6 +52,7 @@ please read the article \code{vignette("chk-families")}. Other misc_checkers: +\code{\link[=chk_all_na]{chk_all_na()}}, \code{\link[=chk_join]{chk_join()}}, \code{\link[=chk_not_empty]{chk_not_empty()}}, \code{\link[=chk_unique]{chk_unique()}} diff --git a/man/chk_not_empty.Rd b/man/chk_not_empty.Rd index f35698da..e2e499c9 100644 --- a/man/chk_not_empty.Rd +++ b/man/chk_not_empty.Rd @@ -54,6 +54,7 @@ please read the article \code{vignette("chk-families")}. Other misc_checkers: +\code{\link[=chk_all_na]{chk_all_na()}}, \code{\link[=chk_join]{chk_join()}}, \code{\link[=chk_not_any_na]{chk_not_any_na()}}, \code{\link[=chk_unique]{chk_unique()}} diff --git a/man/chk_unique.Rd b/man/chk_unique.Rd index 1794920d..7c1a628c 100644 --- a/man/chk_unique.Rd +++ b/man/chk_unique.Rd @@ -53,6 +53,7 @@ please read the article \code{vignette("chk-families")}. Other misc_checkers: +\code{\link[=chk_all_na]{chk_all_na()}}, \code{\link[=chk_join]{chk_join()}}, \code{\link[=chk_not_any_na]{chk_not_any_na()}}, \code{\link[=chk_not_empty]{chk_not_empty()}} diff --git a/tests/testthat/test-chk-all-na.R b/tests/testthat/test-chk-all-na.R new file mode 100644 index 00000000..cdae26f3 --- /dev/null +++ b/tests/testthat/test-chk-all-na.R @@ -0,0 +1,20 @@ +test_that("vld_not_any_na", { + expect_false(vld_all_na(1)) + expect_false(vld_all_na(matrix(1:3))) + expect_false(vld_all_na(c(1, NA))) + expect_true(vld_all_na(character(0))) + expect_true(vld_all_na(NULL)) + expect_true(vld_all_na(c())) + expect_true(vld_all_na(NA)) + expect_true(vld_all_na(c(NA, NA_real_, NA_character_))) +}) + +test_that("chk_not_any_na", { + expect_chk_error(chk_all_na(1), "`1` must only have missing values\\.") + expect_invisible(chk_all_na(NA_real_)) + expect_no_error(chk_all_na(NA)) + expect_chk_error( + chk_all_na("NA", x_name = 1), + "^1 must only have missing values[.]$" + ) +}) diff --git a/vignettes/chk-families.Rmd b/vignettes/chk-families.Rmd index 178faed2..37d32b37 100644 --- a/vignettes/chk-families.Rmd +++ b/vignettes/chk-families.Rmd @@ -519,10 +519,13 @@ while for a vector or list, it corresponds to the number of elements. `chk_not_any_na` function checks if there are no NA values present in the entire object. +`chk_all_na` function checks if all values are NA in the entire object. + Function | Code :- | :-- `chk_not_empty(x)` | `length(x) != 0L` `chk_not_any_na(x)` | `!anyNA(x)` +`chk_all_na(x)` | `all(is.na(x))` ```{r} vld_not_empty(c()) # FALSE @@ -533,6 +536,10 @@ vld_not_empty(data.frame(a = 1:3, b = 4:6)) # TRUE vld_not_any_na(data.frame(a = 1:3, b = 4:6)) # TRUE vld_not_any_na(data.frame(a = c(1, NA, 3), b = c(4, 5, 6))) # FALSE + + +vld_all_na(data.frame(a = c(NA_character_, NA_character_), b = NA_real_)) # TRUE +vld_all_na(data.frame(a = c(1, NA, 3), b = c(4, 5, 6))) # FALSE ``` The `chk_unique()` function is designed to verify that there are no duplicates elements in a vector. From b13ede1a7875af790df90f589cec603a954119fb Mon Sep 17 00:00:00 2001 From: Stefano Mezzini <42444204+StefanoMezzini@users.noreply.github.com> Date: Mon, 6 Jul 2026 11:13:42 -0700 Subject: [PATCH 2/2] add `chk_all_na()` to `_pkgdown.yml` --- _pkgdown.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/_pkgdown.yml b/_pkgdown.yml index ce3716ff..374f0d26 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -141,6 +141,7 @@ reference: - title: Quality Checkers (Miscellaneous) desc: Check if the function input meet some user defined quality criteria contents: + - chk_all_na - chk_not_any_na - chk_not_empty - chk_unique