Skip to contents

Checks if there is a one to one mapping between two lists of variables.

Usage

assert_one_to_one(
  dataset,
  vars1,
  vars2,
  dataset_name = rlang::caller_arg(dataset),
  message = NULL,
  class = "assert_one_to_one",
  call = parent.frame()
)

Arguments

dataset

Dataset to be checked

The variables specified for vars1 and vars2 are expected.

vars1

First list of variables

vars2

Second list of variables

dataset_name

string indicating the label/symbol of the object being checked. Default is rlang::caller_arg(dataset).

message

string passed to cli::cli_abort(message). When NULL, default messaging is used (see examples for default messages). "dataset_name" can be used in messaging.

class

Subclass of the condition.

call

The execution environment of a currently running function, e.g. call = caller_env(). The corresponding function call is retrieved and mentioned in error messages as the source of the error.

You only need to supply call when throwing a condition from a helper function which wouldn't be relevant to mention in the message.

Can also be NULL or a defused function call to respectively not display any call or hard-code a code to display.

For more information about error calls, see Including function calls in error messages.

Value

An error if the condition is not meet. The input otherwise.

Examples

library(dplyr)
library(rlang)

df <- tribble(
  ~SPECIES, ~SPECIESN,
  "DOG",           1L,
  "CAT",           2L,
  "DOG",           1L
)

assert_one_to_one(df, vars1 = exprs(SPECIES), vars2 = exprs(SPECIESN))

df_many <- tribble(
  ~SPECIES, ~SPECIESN,
  "DOG",           1L,
  "CAT",           2L,
  "DOG",           3L
)

try(
  assert_one_to_one(df_many, vars1 = exprs(SPECIES), vars2 = exprs(SPECIESN))
)
#> Error in eval(expr, envir, enclos) : 
#>   For some values of "SPECIES" there is more than one value of "SPECIESN"
#>  Call `admiral::get_one_to_many_dataset()` to get all one-to-many values.

try(
  assert_one_to_one(df_many, vars1 = exprs(SPECIESN), vars2 = exprs(SPECIES))
)
#> Error in eval(expr, envir, enclos) : 
#>   There is more than one value of "SPECIESN" for some values of "SPECIES"
#>  Call `admiral::get_many_to_one_dataset()` to get all many-to-one values.