From 8faf5799181dfd1acfe5fa681565e1f3900af4b5 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 19 Nov 2025 10:06:16 +0000 Subject: [PATCH 1/4] Initial plan From b81ac6cacace8b11ff22ba233aad4a4081d7b52a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 19 Nov 2025 10:16:15 +0000 Subject: [PATCH 2/4] Update minimum R version to 4.1 to match testthat requirement Co-authored-by: krlmlr <1741643+krlmlr@users.noreply.github.com> --- DESCRIPTION | 2 +- chk.Rcheck/00_pkg_src/chk/DESCRIPTION | 46 + chk.Rcheck/00_pkg_src/chk/LICENSE | 2 + chk.Rcheck/00_pkg_src/chk/NAMESPACE | 187 ++ chk.Rcheck/00_pkg_src/chk/NEWS.md | 282 ++ chk.Rcheck/00_pkg_src/chk/R/aaa.R | 12 + chk.Rcheck/00_pkg_src/chk/R/cc.R | 54 + chk.Rcheck/00_pkg_src/chk/R/check-data.R | 46 + chk.Rcheck/00_pkg_src/chk/R/check-dim.R | 53 + chk.Rcheck/00_pkg_src/chk/R/check-dirs.R | 36 + chk.Rcheck/00_pkg_src/chk/R/check-files.R | 36 + chk.Rcheck/00_pkg_src/chk/R/check-key.R | 42 + chk.Rcheck/00_pkg_src/chk/R/check-length.R | 20 + chk.Rcheck/00_pkg_src/chk/R/check-names.R | 54 + chk.Rcheck/00_pkg_src/chk/R/check-values.R | 77 + chk.Rcheck/00_pkg_src/chk/R/chk-all-equal.R | 42 + .../00_pkg_src/chk/R/chk-all-equivalent.R | 43 + .../00_pkg_src/chk/R/chk-all-identical.R | 46 + chk.Rcheck/00_pkg_src/chk/R/chk-all.R | 58 + chk.Rcheck/00_pkg_src/chk/R/chk-array.R | 39 + chk.Rcheck/00_pkg_src/chk/R/chk-atomic.R | 41 + .../chk/R/chk-character-or-factor.R | 46 + chk.Rcheck/00_pkg_src/chk/R/chk-character.R | 43 + chk.Rcheck/00_pkg_src/chk/R/chk-chr.R | 57 + .../00_pkg_src/chk/R/chk-compatible-lengths.R | 106 + .../00_pkg_src/chk/R/chk-complex-number.R | 47 + chk.Rcheck/00_pkg_src/chk/R/chk-complex.R | 41 + chk.Rcheck/00_pkg_src/chk/R/chk-count.R | 44 + chk.Rcheck/00_pkg_src/chk/R/chk-data.R | 43 + chk.Rcheck/00_pkg_src/chk/R/chk-date.R | 41 + chk.Rcheck/00_pkg_src/chk/R/chk-datetime.R | 77 + chk.Rcheck/00_pkg_src/chk/R/chk-dbl.R | 56 + chk.Rcheck/00_pkg_src/chk/R/chk-dir.R | 44 + chk.Rcheck/00_pkg_src/chk/R/chk-double.R | 43 + chk.Rcheck/00_pkg_src/chk/R/chk-environment.R | 41 + chk.Rcheck/00_pkg_src/chk/R/chk-equal.R | 48 + chk.Rcheck/00_pkg_src/chk/R/chk-equivalent.R | 47 + chk.Rcheck/00_pkg_src/chk/R/chk-ext.R | 46 + chk.Rcheck/00_pkg_src/chk/R/chk-factor.R | 41 + chk.Rcheck/00_pkg_src/chk/R/chk-false.R | 43 + chk.Rcheck/00_pkg_src/chk/R/chk-file.R | 42 + chk.Rcheck/00_pkg_src/chk/R/chk-flag.R | 47 + chk.Rcheck/00_pkg_src/chk/R/chk-function.R | 45 + chk.Rcheck/00_pkg_src/chk/R/chk-gt.R | 46 + chk.Rcheck/00_pkg_src/chk/R/chk-gte.R | 48 + chk.Rcheck/00_pkg_src/chk/R/chk-identical.R | 43 + chk.Rcheck/00_pkg_src/chk/R/chk-integer.R | 42 + chk.Rcheck/00_pkg_src/chk/R/chk-is.R | 41 + chk.Rcheck/00_pkg_src/chk/R/chk-join.R | 53 + chk.Rcheck/00_pkg_src/chk/R/chk-length.R | 42 + chk.Rcheck/00_pkg_src/chk/R/chk-lgl.R | 54 + chk.Rcheck/00_pkg_src/chk/R/chk-list.R | 41 + chk.Rcheck/00_pkg_src/chk/R/chk-logical.R | 47 + chk.Rcheck/00_pkg_src/chk/R/chk-lt.R | 47 + chk.Rcheck/00_pkg_src/chk/R/chk-lte.R | 47 + chk.Rcheck/00_pkg_src/chk/R/chk-match.R | 46 + chk.Rcheck/00_pkg_src/chk/R/chk-matrix.R | 38 + chk.Rcheck/00_pkg_src/chk/R/chk-missing.R | 50 + chk.Rcheck/00_pkg_src/chk/R/chk-named.R | 43 + chk.Rcheck/00_pkg_src/chk/R/chk-not-any-na.R | 45 + chk.Rcheck/00_pkg_src/chk/R/chk-not-empty.R | 46 + chk.Rcheck/00_pkg_src/chk/R/chk-not-missing.R | 50 + chk.Rcheck/00_pkg_src/chk/R/chk-not-null.R | 39 + chk.Rcheck/00_pkg_src/chk/R/chk-not-subset.R | 45 + chk.Rcheck/00_pkg_src/chk/R/chk-null-or.R | 55 + chk.Rcheck/00_pkg_src/chk/R/chk-null.R | 39 + chk.Rcheck/00_pkg_src/chk/R/chk-number.R | 44 + chk.Rcheck/00_pkg_src/chk/R/chk-numeric.R | 46 + chk.Rcheck/00_pkg_src/chk/R/chk-orderset.R | 51 + chk.Rcheck/00_pkg_src/chk/R/chk-package.R | 8 + chk.Rcheck/00_pkg_src/chk/R/chk-range.R | 71 + chk.Rcheck/00_pkg_src/chk/R/chk-raw.R | 40 + chk.Rcheck/00_pkg_src/chk/R/chk-s3-class.R | 39 + chk.Rcheck/00_pkg_src/chk/R/chk-s4-class.R | 39 + chk.Rcheck/00_pkg_src/chk/R/chk-scalar.R | 38 + chk.Rcheck/00_pkg_src/chk/R/chk-setequal.R | 41 + chk.Rcheck/00_pkg_src/chk/R/chk-sorted.R | 38 + chk.Rcheck/00_pkg_src/chk/R/chk-string.R | 43 + chk.Rcheck/00_pkg_src/chk/R/chk-subset.R | 47 + chk.Rcheck/00_pkg_src/chk/R/chk-superset.R | 45 + chk.Rcheck/00_pkg_src/chk/R/chk-true.R | 43 + chk.Rcheck/00_pkg_src/chk/R/chk-tz.R | 44 + chk.Rcheck/00_pkg_src/chk/R/chk-unique.R | 45 + chk.Rcheck/00_pkg_src/chk/R/chk-unused.R | 46 + chk.Rcheck/00_pkg_src/chk/R/chk-used.R | 45 + chk.Rcheck/00_pkg_src/chk/R/chk-valid-name.R | 38 + chk.Rcheck/00_pkg_src/chk/R/chk-vector.R | 43 + .../00_pkg_src/chk/R/chk-whole-number.R | 52 + .../00_pkg_src/chk/R/chk-whole-numeric.R | 52 + chk.Rcheck/00_pkg_src/chk/R/chk-wnum.R | 56 + chk.Rcheck/00_pkg_src/chk/R/chkor-vld.R | 79 + chk.Rcheck/00_pkg_src/chk/R/chkor.R | 26 + chk.Rcheck/00_pkg_src/chk/R/deprecated.R | 186 ++ chk.Rcheck/00_pkg_src/chk/R/err.R | 128 + .../00_pkg_src/chk/R/expect-chk-error.R | 20 + chk.Rcheck/00_pkg_src/chk/R/internal.R | 16 + chk.Rcheck/00_pkg_src/chk/R/new-duplicated.R | 56 + chk.Rcheck/00_pkg_src/chk/R/p.R | 25 + chk.Rcheck/00_pkg_src/chk/R/params.R | 51 + chk.Rcheck/00_pkg_src/chk/R/utils.R | 48 + chk.Rcheck/00_pkg_src/chk/README.md | 121 + chk.Rcheck/00_pkg_src/chk/build/vignette.rds | Bin 0 -> 231 bytes chk.Rcheck/00_pkg_src/chk/inst/WORDLIST | 36 + .../00_pkg_src/chk/inst/doc/chk-families.R | 225 ++ .../00_pkg_src/chk/inst/doc/chk-families.Rmd | 636 +++++ chk.Rcheck/00_pkg_src/chk/inst/doc/chk.R | 50 + chk.Rcheck/00_pkg_src/chk/inst/doc/chk.Rmd | 142 + chk.Rcheck/00_pkg_src/chk/man/aaa.Rd | 15 + chk.Rcheck/00_pkg_src/chk/man/abort_chk.Rd | 48 + chk.Rcheck/00_pkg_src/chk/man/cc.Rd | 47 + chk.Rcheck/00_pkg_src/chk/man/check_data.Rd | 55 + chk.Rcheck/00_pkg_src/chk/man/check_dim.Rd | 42 + chk.Rcheck/00_pkg_src/chk/man/check_dirs.Rd | 36 + chk.Rcheck/00_pkg_src/chk/man/check_files.Rd | 36 + chk.Rcheck/00_pkg_src/chk/man/check_key.Rd | 39 + chk.Rcheck/00_pkg_src/chk/man/check_length.Rd | 37 + chk.Rcheck/00_pkg_src/chk/man/check_names.Rd | 48 + chk.Rcheck/00_pkg_src/chk/man/check_values.Rd | 59 + chk.Rcheck/00_pkg_src/chk/man/chk-package.Rd | 40 + chk.Rcheck/00_pkg_src/chk/man/chk_all.Rd | 59 + .../00_pkg_src/chk/man/chk_all_equal.Rd | 66 + .../00_pkg_src/chk/man/chk_all_equivalent.Rd | 66 + .../00_pkg_src/chk/man/chk_all_identical.Rd | 66 + chk.Rcheck/00_pkg_src/chk/man/chk_array.Rd | 55 + chk.Rcheck/00_pkg_src/chk/man/chk_atomic.Rd | 57 + .../00_pkg_src/chk/man/chk_character.Rd | 63 + .../chk/man/chk_character_or_factor.Rd | 70 + chk.Rcheck/00_pkg_src/chk/man/chk_chr.Rd | 54 + .../chk/man/chk_compatible_lengths.Rd | 93 + chk.Rcheck/00_pkg_src/chk/man/chk_complex.Rd | 61 + .../00_pkg_src/chk/man/chk_complex_number.Rd | 54 + chk.Rcheck/00_pkg_src/chk/man/chk_count.Rd | 68 + chk.Rcheck/00_pkg_src/chk/man/chk_data.Rd | 57 + chk.Rcheck/00_pkg_src/chk/man/chk_date.Rd | 66 + .../00_pkg_src/chk/man/chk_date_time.Rd | 80 + chk.Rcheck/00_pkg_src/chk/man/chk_dbl.Rd | 54 + .../00_pkg_src/chk/man/chk_deprecated.Rd | 124 + chk.Rcheck/00_pkg_src/chk/man/chk_dir.Rd | 55 + chk.Rcheck/00_pkg_src/chk/man/chk_double.Rd | 63 + .../00_pkg_src/chk/man/chk_environment.Rd | 60 + chk.Rcheck/00_pkg_src/chk/man/chk_equal.Rd | 62 + .../00_pkg_src/chk/man/chk_equivalent.Rd | 61 + chk.Rcheck/00_pkg_src/chk/man/chk_ext.Rd | 59 + chk.Rcheck/00_pkg_src/chk/man/chk_factor.Rd | 54 + chk.Rcheck/00_pkg_src/chk/man/chk_false.Rd | 71 + chk.Rcheck/00_pkg_src/chk/man/chk_file.Rd | 54 + chk.Rcheck/00_pkg_src/chk/man/chk_flag.Rd | 74 + chk.Rcheck/00_pkg_src/chk/man/chk_function.Rd | 58 + chk.Rcheck/00_pkg_src/chk/man/chk_gt.Rd | 61 + chk.Rcheck/00_pkg_src/chk/man/chk_gte.Rd | 59 + .../00_pkg_src/chk/man/chk_identical.Rd | 57 + chk.Rcheck/00_pkg_src/chk/man/chk_integer.Rd | 62 + chk.Rcheck/00_pkg_src/chk/man/chk_is.Rd | 55 + chk.Rcheck/00_pkg_src/chk/man/chk_join.Rd | 56 + chk.Rcheck/00_pkg_src/chk/man/chk_length.Rd | 55 + chk.Rcheck/00_pkg_src/chk/man/chk_lgl.Rd | 74 + chk.Rcheck/00_pkg_src/chk/man/chk_list.Rd | 57 + chk.Rcheck/00_pkg_src/chk/man/chk_logical.Rd | 73 + chk.Rcheck/00_pkg_src/chk/man/chk_lt.Rd | 61 + chk.Rcheck/00_pkg_src/chk/man/chk_lte.Rd | 59 + chk.Rcheck/00_pkg_src/chk/man/chk_match.Rd | 55 + chk.Rcheck/00_pkg_src/chk/man/chk_matrix.Rd | 54 + chk.Rcheck/00_pkg_src/chk/man/chk_missing.Rd | 62 + chk.Rcheck/00_pkg_src/chk/man/chk_named.Rd | 57 + .../00_pkg_src/chk/man/chk_not_any_na.Rd | 59 + .../00_pkg_src/chk/man/chk_not_empty.Rd | 61 + .../00_pkg_src/chk/man/chk_not_missing.Rd | 62 + chk.Rcheck/00_pkg_src/chk/man/chk_not_null.Rd | 51 + .../00_pkg_src/chk/man/chk_not_subset.Rd | 47 + chk.Rcheck/00_pkg_src/chk/man/chk_null.Rd | 51 + chk.Rcheck/00_pkg_src/chk/man/chk_null_or.Rd | 30 + chk.Rcheck/00_pkg_src/chk/man/chk_number.Rd | 53 + chk.Rcheck/00_pkg_src/chk/man/chk_numeric.Rd | 66 + chk.Rcheck/00_pkg_src/chk/man/chk_orderset.Rd | 47 + chk.Rcheck/00_pkg_src/chk/man/chk_range.Rd | 68 + chk.Rcheck/00_pkg_src/chk/man/chk_raw.Rd | 60 + chk.Rcheck/00_pkg_src/chk/man/chk_s3_class.Rd | 55 + chk.Rcheck/00_pkg_src/chk/man/chk_s4_class.Rd | 55 + chk.Rcheck/00_pkg_src/chk/man/chk_scalar.Rd | 59 + chk.Rcheck/00_pkg_src/chk/man/chk_setequal.Rd | 69 + chk.Rcheck/00_pkg_src/chk/man/chk_sorted.Rd | 48 + chk.Rcheck/00_pkg_src/chk/man/chk_string.Rd | 62 + chk.Rcheck/00_pkg_src/chk/man/chk_subset.Rd | 69 + chk.Rcheck/00_pkg_src/chk/man/chk_superset.Rd | 60 + chk.Rcheck/00_pkg_src/chk/man/chk_true.Rd | 71 + chk.Rcheck/00_pkg_src/chk/man/chk_tz.Rd | 63 + chk.Rcheck/00_pkg_src/chk/man/chk_unique.Rd | 60 + chk.Rcheck/00_pkg_src/chk/man/chk_unused.Rd | 53 + chk.Rcheck/00_pkg_src/chk/man/chk_used.Rd | 53 + .../00_pkg_src/chk/man/chk_valid_name.Rd | 52 + chk.Rcheck/00_pkg_src/chk/man/chk_vector.Rd | 58 + .../00_pkg_src/chk/man/chk_whole_number.Rd | 63 + .../00_pkg_src/chk/man/chk_whole_numeric.Rd | 62 + chk.Rcheck/00_pkg_src/chk/man/chk_wnum.Rd | 54 + chk.Rcheck/00_pkg_src/chk/man/chkor.Rd | 30 + chk.Rcheck/00_pkg_src/chk/man/chkor_vld.Rd | 34 + .../chk/man/deparse_backtick_chk.Rd | 43 + chk.Rcheck/00_pkg_src/chk/man/err.Rd | 77 + .../00_pkg_src/chk/man/expect_chk_error.Rd | 105 + .../chk/man/figures/lifecycle-archived.svg | 1 + .../chk/man/figures/lifecycle-defunct.svg | 1 + .../chk/man/figures/lifecycle-deprecated.svg | 21 + .../man/figures/lifecycle-experimental.svg | 21 + .../chk/man/figures/lifecycle-maturing.svg | 1 + .../chk/man/figures/lifecycle-questioning.svg | 1 + .../chk/man/figures/lifecycle-retired.svg | 1 + .../man/figures/lifecycle-soft-deprecated.svg | 1 + .../chk/man/figures/lifecycle-stable.svg | 29 + .../chk/man/figures/lifecycle-superseded.svg | 21 + .../00_pkg_src/chk/man/figures/logo.png | Bin 0 -> 2866 bytes chk.Rcheck/00_pkg_src/chk/man/message_chk.Rd | 48 + chk.Rcheck/00_pkg_src/chk/man/p.Rd | 38 + chk.Rcheck/00_pkg_src/chk/man/params.Rd | 79 + chk.Rcheck/00_pkg_src/chk/tests/testthat.R | 12 + .../chk/tests/testthat/test-aaa-deprecated.R | 34 + .../00_pkg_src/chk/tests/testthat/test-cc.R | 89 + .../chk/tests/testthat/test-check-data.R | 35 + .../chk/tests/testthat/test-check-dim.R | 67 + .../chk/tests/testthat/test-check-dirs.R | 44 + .../chk/tests/testthat/test-check-files.R | 39 + .../chk/tests/testthat/test-check-key.R | 25 + .../chk/tests/testthat/test-check-length.R | 44 + .../chk/tests/testthat/test-check-names.R | 47 + .../chk/tests/testthat/test-check-values.R | 108 + .../chk/tests/testthat/test-chk-all.R | 93 + .../chk/tests/testthat/test-chk-array.R | 15 + .../chk/tests/testthat/test-chk-atomic.R | 20 + .../testthat/test-chk-character-or-factor.R | 18 + .../chk/tests/testthat/test-chk-character.R | 18 + .../chk/tests/testthat/test-chk-chr.R | 22 + .../testthat/test-chk-compatible-lengths.R | 145 + .../tests/testthat/test-chk-complex-number.R | 15 + .../chk/tests/testthat/test-chk-complex.R | 17 + .../chk/tests/testthat/test-chk-count.R | 16 + .../chk/tests/testthat/test-chk-data.R | 15 + .../chk/tests/testthat/test-chk-date-time.R | 31 + .../chk/tests/testthat/test-chk-date.R | 14 + .../chk/tests/testthat/test-chk-dbl.R | 25 + .../chk/tests/testthat/test-chk-double.R | 17 + .../chk/tests/testthat/test-chk-environment.R | 13 + .../chk/tests/testthat/test-chk-factor.R | 17 + .../chk/tests/testthat/test-chk-file.R | 96 + .../chk/tests/testthat/test-chk-identical.R | 106 + .../chk/tests/testthat/test-chk-integer.R | 17 + .../chk/tests/testthat/test-chk-is.R | 28 + .../chk/tests/testthat/test-chk-join.R | 49 + .../chk/tests/testthat/test-chk-length.R | 18 + .../chk/tests/testthat/test-chk-lgl.R | 19 + .../chk/tests/testthat/test-chk-logical.R | 17 + .../chk/tests/testthat/test-chk-matrix.R | 16 + .../chk/tests/testthat/test-chk-missing.R | 42 + .../chk/tests/testthat/test-chk-not-any-na.R | 15 + .../chk/tests/testthat/test-chk-not-empty.R | 20 + .../chk/tests/testthat/test-chk-not-missing.R | 39 + .../chk/tests/testthat/test-chk-not-subset.R | 23 + .../chk/tests/testthat/test-chk-null-or.R | 44 + .../chk/tests/testthat/test-chk-null.R | 25 + .../chk/tests/testthat/test-chk-number.R | 18 + .../chk/tests/testthat/test-chk-numeric.R | 15 + .../chk/tests/testthat/test-chk-orderset.R | 17 + .../chk/tests/testthat/test-chk-range.R | 97 + .../chk/tests/testthat/test-chk-raw.R | 18 + .../chk/tests/testthat/test-chk-setequal.R | 14 + .../chk/tests/testthat/test-chk-sorted.R | 18 + .../chk/tests/testthat/test-chk-string.R | 38 + .../chk/tests/testthat/test-chk-subset.R | 45 + .../chk/tests/testthat/test-chk-superset.R | 17 + .../chk/tests/testthat/test-chk-true.R | 53 + .../chk/tests/testthat/test-chk-type.R | 134 + .../chk/tests/testthat/test-chk-tz.R | 17 + .../chk/tests/testthat/test-chk-unique.R | 66 + .../chk/tests/testthat/test-chk-unused.R | 21 + .../chk/tests/testthat/test-chk-valid-name.R | 18 + .../chk/tests/testthat/test-chk-vector.R | 22 + .../tests/testthat/test-chk-whole-number.R | 11 + .../chk/tests/testthat/test-chk-wnum.R | 26 + .../chk/tests/testthat/test-chkor-vld.R | 11 + .../chk/tests/testthat/test-chkor.R | 12 + .../00_pkg_src/chk/tests/testthat/test-err.R | 103 + .../tests/testthat/test-expect-chk-error.R | 7 + .../chk/tests/testthat/test-internal.R | 6 + .../00_pkg_src/chk/tests/testthat/test-p.R | 7 + .../chk/tests/testthat/test-utils.R | 19 + .../00_pkg_src/chk/vignettes/chk-families.Rmd | 636 +++++ chk.Rcheck/00_pkg_src/chk/vignettes/chk.Rmd | 142 + .../chk/vignettes/chk_diagram_II.png | Bin 0 -> 283461 bytes chk.Rcheck/00check.log | 63 + chk.Rcheck/00install.out | 15 + chk.Rcheck/chk-Ex.R | 2094 ++++++++++++++ chk.Rcheck/chk-Ex.Rout | 2527 +++++++++++++++++ chk.Rcheck/chk-Ex.pdf | Bin 0 -> 3611 bytes chk.Rcheck/chk/DESCRIPTION | 47 + chk.Rcheck/chk/INDEX | 93 + chk.Rcheck/chk/LICENSE | 2 + chk.Rcheck/chk/Meta/Rd.rds | Bin 0 -> 3099 bytes chk.Rcheck/chk/Meta/features.rds | Bin 0 -> 123 bytes chk.Rcheck/chk/Meta/hsearch.rds | Bin 0 -> 3008 bytes chk.Rcheck/chk/Meta/links.rds | Bin 0 -> 1722 bytes chk.Rcheck/chk/Meta/nsInfo.rds | Bin 0 -> 1105 bytes chk.Rcheck/chk/Meta/package.rds | Bin 0 -> 1423 bytes chk.Rcheck/chk/Meta/vignette.rds | Bin 0 -> 231 bytes chk.Rcheck/chk/NAMESPACE | 187 ++ chk.Rcheck/chk/NEWS.md | 282 ++ chk.Rcheck/chk/R/chk | 27 + chk.Rcheck/chk/R/chk.rdb | Bin 0 -> 203447 bytes chk.Rcheck/chk/R/chk.rdx | Bin 0 -> 3091 bytes chk.Rcheck/chk/WORDLIST | 36 + chk.Rcheck/chk/doc/chk-families.R | 225 ++ chk.Rcheck/chk/doc/chk-families.Rmd | 636 +++++ chk.Rcheck/chk/doc/chk.R | 50 + chk.Rcheck/chk/doc/chk.Rmd | 142 + chk.Rcheck/chk/help/AnIndex | 190 ++ chk.Rcheck/chk/help/aliases.rds | Bin 0 -> 1144 bytes chk.Rcheck/chk/help/chk.rdb | Bin 0 -> 243990 bytes chk.Rcheck/chk/help/chk.rdx | Bin 0 -> 2041 bytes .../chk/help/figures/lifecycle-archived.svg | 1 + .../chk/help/figures/lifecycle-defunct.svg | 1 + .../chk/help/figures/lifecycle-deprecated.svg | 21 + .../help/figures/lifecycle-experimental.svg | 21 + .../chk/help/figures/lifecycle-maturing.svg | 1 + .../help/figures/lifecycle-questioning.svg | 1 + .../chk/help/figures/lifecycle-retired.svg | 1 + .../figures/lifecycle-soft-deprecated.svg | 1 + .../chk/help/figures/lifecycle-stable.svg | 29 + .../chk/help/figures/lifecycle-superseded.svg | 21 + chk.Rcheck/chk/help/figures/logo.png | Bin 0 -> 2866 bytes chk.Rcheck/chk/help/paths.rds | Bin 0 -> 788 bytes chk.Rcheck/chk/html/R.css | 130 + chk.Rcheck/tests/startup.Rs | 4 + chk.Rcheck/tests/testthat.R | 12 + chk.Rcheck/tests/testthat.Rout | 34 + .../tests/testthat/test-aaa-deprecated.R | 34 + chk.Rcheck/tests/testthat/test-cc.R | 89 + chk.Rcheck/tests/testthat/test-check-data.R | 35 + chk.Rcheck/tests/testthat/test-check-dim.R | 67 + chk.Rcheck/tests/testthat/test-check-dirs.R | 44 + chk.Rcheck/tests/testthat/test-check-files.R | 39 + chk.Rcheck/tests/testthat/test-check-key.R | 25 + chk.Rcheck/tests/testthat/test-check-length.R | 44 + chk.Rcheck/tests/testthat/test-check-names.R | 47 + chk.Rcheck/tests/testthat/test-check-values.R | 108 + chk.Rcheck/tests/testthat/test-chk-all.R | 93 + chk.Rcheck/tests/testthat/test-chk-array.R | 15 + chk.Rcheck/tests/testthat/test-chk-atomic.R | 20 + .../testthat/test-chk-character-or-factor.R | 18 + .../tests/testthat/test-chk-character.R | 18 + chk.Rcheck/tests/testthat/test-chk-chr.R | 22 + .../testthat/test-chk-compatible-lengths.R | 145 + .../tests/testthat/test-chk-complex-number.R | 15 + chk.Rcheck/tests/testthat/test-chk-complex.R | 17 + chk.Rcheck/tests/testthat/test-chk-count.R | 16 + chk.Rcheck/tests/testthat/test-chk-data.R | 15 + .../tests/testthat/test-chk-date-time.R | 31 + chk.Rcheck/tests/testthat/test-chk-date.R | 14 + chk.Rcheck/tests/testthat/test-chk-dbl.R | 25 + chk.Rcheck/tests/testthat/test-chk-double.R | 17 + .../tests/testthat/test-chk-environment.R | 13 + chk.Rcheck/tests/testthat/test-chk-factor.R | 17 + chk.Rcheck/tests/testthat/test-chk-file.R | 96 + .../tests/testthat/test-chk-identical.R | 106 + chk.Rcheck/tests/testthat/test-chk-integer.R | 17 + chk.Rcheck/tests/testthat/test-chk-is.R | 28 + chk.Rcheck/tests/testthat/test-chk-join.R | 49 + chk.Rcheck/tests/testthat/test-chk-length.R | 18 + chk.Rcheck/tests/testthat/test-chk-lgl.R | 19 + chk.Rcheck/tests/testthat/test-chk-logical.R | 17 + chk.Rcheck/tests/testthat/test-chk-matrix.R | 16 + chk.Rcheck/tests/testthat/test-chk-missing.R | 42 + .../tests/testthat/test-chk-not-any-na.R | 15 + .../tests/testthat/test-chk-not-empty.R | 20 + .../tests/testthat/test-chk-not-missing.R | 39 + .../tests/testthat/test-chk-not-subset.R | 23 + chk.Rcheck/tests/testthat/test-chk-null-or.R | 44 + chk.Rcheck/tests/testthat/test-chk-null.R | 25 + chk.Rcheck/tests/testthat/test-chk-number.R | 18 + chk.Rcheck/tests/testthat/test-chk-numeric.R | 15 + chk.Rcheck/tests/testthat/test-chk-orderset.R | 17 + chk.Rcheck/tests/testthat/test-chk-range.R | 97 + chk.Rcheck/tests/testthat/test-chk-raw.R | 18 + chk.Rcheck/tests/testthat/test-chk-setequal.R | 14 + chk.Rcheck/tests/testthat/test-chk-sorted.R | 18 + chk.Rcheck/tests/testthat/test-chk-string.R | 38 + chk.Rcheck/tests/testthat/test-chk-subset.R | 45 + chk.Rcheck/tests/testthat/test-chk-superset.R | 17 + chk.Rcheck/tests/testthat/test-chk-true.R | 53 + chk.Rcheck/tests/testthat/test-chk-type.R | 134 + chk.Rcheck/tests/testthat/test-chk-tz.R | 17 + chk.Rcheck/tests/testthat/test-chk-unique.R | 66 + chk.Rcheck/tests/testthat/test-chk-unused.R | 21 + .../tests/testthat/test-chk-valid-name.R | 18 + chk.Rcheck/tests/testthat/test-chk-vector.R | 22 + .../tests/testthat/test-chk-whole-number.R | 11 + chk.Rcheck/tests/testthat/test-chk-wnum.R | 26 + chk.Rcheck/tests/testthat/test-chkor-vld.R | 11 + chk.Rcheck/tests/testthat/test-chkor.R | 12 + chk.Rcheck/tests/testthat/test-err.R | 103 + .../tests/testthat/test-expect-chk-error.R | 7 + chk.Rcheck/tests/testthat/test-internal.R | 6 + chk.Rcheck/tests/testthat/test-p.R | 7 + chk.Rcheck/tests/testthat/test-utils.R | 19 + chk_0.10.0.9012.tar.gz | Bin 0 -> 674555 bytes 401 files changed, 24445 insertions(+), 1 deletion(-) create mode 100644 chk.Rcheck/00_pkg_src/chk/DESCRIPTION create mode 100644 chk.Rcheck/00_pkg_src/chk/LICENSE create mode 100644 chk.Rcheck/00_pkg_src/chk/NAMESPACE create mode 100644 chk.Rcheck/00_pkg_src/chk/NEWS.md create mode 100644 chk.Rcheck/00_pkg_src/chk/R/aaa.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/cc.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/check-data.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/check-dim.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/check-dirs.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/check-files.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/check-key.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/check-length.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/check-names.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/check-values.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-all-equal.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-all-equivalent.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-all-identical.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-all.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-array.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-atomic.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-character-or-factor.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-character.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-chr.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-compatible-lengths.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-complex-number.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-complex.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-count.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-data.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-date.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-datetime.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-dbl.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-dir.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-double.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-environment.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-equal.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-equivalent.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-ext.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-factor.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-false.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-file.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-flag.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-function.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-gt.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-gte.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-identical.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-integer.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-is.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-join.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-length.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-lgl.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-list.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-logical.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-lt.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-lte.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-match.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-matrix.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-missing.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-named.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-not-any-na.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-not-empty.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-not-missing.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-not-null.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-not-subset.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-null-or.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-null.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-number.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-numeric.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-orderset.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-package.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-range.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-raw.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-s3-class.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-s4-class.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-scalar.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-setequal.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-sorted.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-string.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-subset.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-superset.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-true.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-tz.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-unique.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-unused.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-used.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-valid-name.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-vector.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-whole-number.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-whole-numeric.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chk-wnum.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chkor-vld.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/chkor.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/deprecated.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/err.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/expect-chk-error.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/internal.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/new-duplicated.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/p.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/params.R create mode 100644 chk.Rcheck/00_pkg_src/chk/R/utils.R create mode 100644 chk.Rcheck/00_pkg_src/chk/README.md create mode 100644 chk.Rcheck/00_pkg_src/chk/build/vignette.rds create mode 100644 chk.Rcheck/00_pkg_src/chk/inst/WORDLIST create mode 100644 chk.Rcheck/00_pkg_src/chk/inst/doc/chk-families.R create mode 100644 chk.Rcheck/00_pkg_src/chk/inst/doc/chk-families.Rmd create mode 100644 chk.Rcheck/00_pkg_src/chk/inst/doc/chk.R create mode 100644 chk.Rcheck/00_pkg_src/chk/inst/doc/chk.Rmd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/aaa.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/abort_chk.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/cc.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/check_data.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/check_dim.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/check_dirs.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/check_files.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/check_key.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/check_length.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/check_names.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/check_values.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk-package.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_all.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_all_equal.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_all_equivalent.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_all_identical.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_array.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_atomic.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_character.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_character_or_factor.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_chr.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_compatible_lengths.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_complex.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_complex_number.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_count.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_data.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_date.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_date_time.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_dbl.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_deprecated.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_dir.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_double.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_environment.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_equal.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_equivalent.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_ext.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_factor.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_false.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_file.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_flag.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_function.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_gt.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_gte.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_identical.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_integer.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_is.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_join.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_length.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_lgl.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_list.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_logical.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_lt.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_lte.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_match.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_matrix.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_missing.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_named.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_not_any_na.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_not_empty.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_not_missing.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_not_null.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_not_subset.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_null.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_null_or.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_number.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_numeric.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_orderset.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_range.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_raw.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_s3_class.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_s4_class.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_scalar.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_setequal.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_sorted.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_string.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_subset.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_superset.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_true.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_tz.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_unique.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_unused.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_used.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_valid_name.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_vector.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_whole_number.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_whole_numeric.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chk_wnum.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chkor.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/chkor_vld.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/deparse_backtick_chk.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/err.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/expect_chk_error.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/figures/lifecycle-archived.svg create mode 100644 chk.Rcheck/00_pkg_src/chk/man/figures/lifecycle-defunct.svg create mode 100644 chk.Rcheck/00_pkg_src/chk/man/figures/lifecycle-deprecated.svg create mode 100644 chk.Rcheck/00_pkg_src/chk/man/figures/lifecycle-experimental.svg create mode 100644 chk.Rcheck/00_pkg_src/chk/man/figures/lifecycle-maturing.svg create mode 100644 chk.Rcheck/00_pkg_src/chk/man/figures/lifecycle-questioning.svg create mode 100644 chk.Rcheck/00_pkg_src/chk/man/figures/lifecycle-retired.svg create mode 100644 chk.Rcheck/00_pkg_src/chk/man/figures/lifecycle-soft-deprecated.svg create mode 100644 chk.Rcheck/00_pkg_src/chk/man/figures/lifecycle-stable.svg create mode 100644 chk.Rcheck/00_pkg_src/chk/man/figures/lifecycle-superseded.svg create mode 100644 chk.Rcheck/00_pkg_src/chk/man/figures/logo.png create mode 100644 chk.Rcheck/00_pkg_src/chk/man/message_chk.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/p.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/man/params.Rd create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-aaa-deprecated.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-cc.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-check-data.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-check-dim.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-check-dirs.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-check-files.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-check-key.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-check-length.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-check-names.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-check-values.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-all.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-array.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-atomic.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-character-or-factor.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-character.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-chr.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-compatible-lengths.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-complex-number.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-complex.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-count.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-data.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-date-time.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-date.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-dbl.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-double.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-environment.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-factor.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-file.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-identical.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-integer.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-is.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-join.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-length.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-lgl.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-logical.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-matrix.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-missing.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-not-any-na.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-not-empty.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-not-missing.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-not-subset.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-null-or.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-null.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-number.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-numeric.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-orderset.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-range.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-raw.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-setequal.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-sorted.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-string.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-subset.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-superset.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-true.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-type.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-tz.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-unique.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-unused.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-valid-name.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-vector.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-whole-number.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-wnum.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chkor-vld.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chkor.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-err.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-expect-chk-error.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-internal.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-p.R create mode 100644 chk.Rcheck/00_pkg_src/chk/tests/testthat/test-utils.R create mode 100644 chk.Rcheck/00_pkg_src/chk/vignettes/chk-families.Rmd create mode 100644 chk.Rcheck/00_pkg_src/chk/vignettes/chk.Rmd create mode 100644 chk.Rcheck/00_pkg_src/chk/vignettes/chk_diagram_II.png create mode 100644 chk.Rcheck/00check.log create mode 100644 chk.Rcheck/00install.out create mode 100644 chk.Rcheck/chk-Ex.R create mode 100644 chk.Rcheck/chk-Ex.Rout create mode 100644 chk.Rcheck/chk-Ex.pdf create mode 100644 chk.Rcheck/chk/DESCRIPTION create mode 100644 chk.Rcheck/chk/INDEX create mode 100644 chk.Rcheck/chk/LICENSE create mode 100644 chk.Rcheck/chk/Meta/Rd.rds create mode 100644 chk.Rcheck/chk/Meta/features.rds create mode 100644 chk.Rcheck/chk/Meta/hsearch.rds create mode 100644 chk.Rcheck/chk/Meta/links.rds create mode 100644 chk.Rcheck/chk/Meta/nsInfo.rds create mode 100644 chk.Rcheck/chk/Meta/package.rds create mode 100644 chk.Rcheck/chk/Meta/vignette.rds create mode 100644 chk.Rcheck/chk/NAMESPACE create mode 100644 chk.Rcheck/chk/NEWS.md create mode 100644 chk.Rcheck/chk/R/chk create mode 100644 chk.Rcheck/chk/R/chk.rdb create mode 100644 chk.Rcheck/chk/R/chk.rdx create mode 100644 chk.Rcheck/chk/WORDLIST create mode 100644 chk.Rcheck/chk/doc/chk-families.R create mode 100644 chk.Rcheck/chk/doc/chk-families.Rmd create mode 100644 chk.Rcheck/chk/doc/chk.R create mode 100644 chk.Rcheck/chk/doc/chk.Rmd create mode 100644 chk.Rcheck/chk/help/AnIndex create mode 100644 chk.Rcheck/chk/help/aliases.rds create mode 100644 chk.Rcheck/chk/help/chk.rdb create mode 100644 chk.Rcheck/chk/help/chk.rdx create mode 100644 chk.Rcheck/chk/help/figures/lifecycle-archived.svg create mode 100644 chk.Rcheck/chk/help/figures/lifecycle-defunct.svg create mode 100644 chk.Rcheck/chk/help/figures/lifecycle-deprecated.svg create mode 100644 chk.Rcheck/chk/help/figures/lifecycle-experimental.svg create mode 100644 chk.Rcheck/chk/help/figures/lifecycle-maturing.svg create mode 100644 chk.Rcheck/chk/help/figures/lifecycle-questioning.svg create mode 100644 chk.Rcheck/chk/help/figures/lifecycle-retired.svg create mode 100644 chk.Rcheck/chk/help/figures/lifecycle-soft-deprecated.svg create mode 100644 chk.Rcheck/chk/help/figures/lifecycle-stable.svg create mode 100644 chk.Rcheck/chk/help/figures/lifecycle-superseded.svg create mode 100644 chk.Rcheck/chk/help/figures/logo.png create mode 100644 chk.Rcheck/chk/help/paths.rds create mode 100644 chk.Rcheck/chk/html/R.css create mode 100644 chk.Rcheck/tests/startup.Rs create mode 100644 chk.Rcheck/tests/testthat.R create mode 100644 chk.Rcheck/tests/testthat.Rout create mode 100644 chk.Rcheck/tests/testthat/test-aaa-deprecated.R create mode 100644 chk.Rcheck/tests/testthat/test-cc.R create mode 100644 chk.Rcheck/tests/testthat/test-check-data.R create mode 100644 chk.Rcheck/tests/testthat/test-check-dim.R create mode 100644 chk.Rcheck/tests/testthat/test-check-dirs.R create mode 100644 chk.Rcheck/tests/testthat/test-check-files.R create mode 100644 chk.Rcheck/tests/testthat/test-check-key.R create mode 100644 chk.Rcheck/tests/testthat/test-check-length.R create mode 100644 chk.Rcheck/tests/testthat/test-check-names.R create mode 100644 chk.Rcheck/tests/testthat/test-check-values.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-all.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-array.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-atomic.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-character-or-factor.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-character.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-chr.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-compatible-lengths.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-complex-number.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-complex.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-count.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-data.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-date-time.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-date.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-dbl.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-double.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-environment.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-factor.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-file.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-identical.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-integer.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-is.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-join.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-length.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-lgl.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-logical.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-matrix.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-missing.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-not-any-na.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-not-empty.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-not-missing.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-not-subset.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-null-or.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-null.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-number.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-numeric.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-orderset.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-range.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-raw.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-setequal.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-sorted.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-string.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-subset.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-superset.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-true.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-type.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-tz.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-unique.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-unused.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-valid-name.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-vector.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-whole-number.R create mode 100644 chk.Rcheck/tests/testthat/test-chk-wnum.R create mode 100644 chk.Rcheck/tests/testthat/test-chkor-vld.R create mode 100644 chk.Rcheck/tests/testthat/test-chkor.R create mode 100644 chk.Rcheck/tests/testthat/test-err.R create mode 100644 chk.Rcheck/tests/testthat/test-expect-chk-error.R create mode 100644 chk.Rcheck/tests/testthat/test-internal.R create mode 100644 chk.Rcheck/tests/testthat/test-p.R create mode 100644 chk.Rcheck/tests/testthat/test-utils.R create mode 100644 chk_0.10.0.9012.tar.gz diff --git a/DESCRIPTION b/DESCRIPTION index 2969ce0c..e6dc1968 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -23,7 +23,7 @@ URL: https://github.com/poissonconsulting/chk, https://poissonconsulting.github.io/chk/ BugReports: https://github.com/poissonconsulting/chk/issues/ Depends: - R (>= 4.0) + R (>= 4.1) Imports: lifecycle, methods, diff --git a/chk.Rcheck/00_pkg_src/chk/DESCRIPTION b/chk.Rcheck/00_pkg_src/chk/DESCRIPTION new file mode 100644 index 00000000..77744387 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/DESCRIPTION @@ -0,0 +1,46 @@ +Package: chk +Title: Check User-Supplied Function Arguments +Version: 0.10.0.9012 +Authors@R: c( + person("Joe", "Thorley", , "joe@poissonconsulting.ca", role = c("aut", "cre"), + comment = c(ORCID = "0000-0002-7683-4592")), + person("Kirill", "Müller", role = "aut", + comment = c(ORCID = "0000-0002-1416-3412")), + person("Ayla", "Pearson", role = "aut", + comment = c(ORCID = "0000-0001-7388-1222")), + person("Florencia", "D'Andrea", role = "ctb"), + person("Nadine", "Hussein", , "nadine@poissonconsulting.ca", role = "ctb", + comment = c(ORCID = "0000-0003-4470-8361")), + person("Evan", "Amies-Galonski", , "evan@poissonconsulting.ca", role = "ctb", + comment = c(ORCID = "0000-0003-1096-2089")), + person("Poisson Consulting", role = c("cph", "fnd")) + ) +Description: For developers to check user-supplied function arguments. It + is designed to be simple, fast and customizable. Error messages + follow the tidyverse style guide. +License: MIT + file LICENSE +URL: https://github.com/poissonconsulting/chk, + https://poissonconsulting.github.io/chk/ +BugReports: https://github.com/poissonconsulting/chk/issues/ +Depends: R (>= 4.1) +Imports: lifecycle, methods, rlang, tools +Suggests: covr, knitr, rmarkdown, testthat (>= 3.0.0), withr +VignetteBuilder: knitr +RdMacros: lifecycle +Config/Needs/website: poissonconsulting/poissontemplate +Config/testthat/edition: 3 +Encoding: UTF-8 +Language: en-US +Roxygen: list(markdown = TRUE) +RoxygenNote: 7.3.3.9000 +NeedsCompilation: no +Packaged: 2025-11-19 10:15:16 UTC; runner +Author: Joe Thorley [aut, cre] (ORCID: ), + Kirill Müller [aut] (ORCID: ), + Ayla Pearson [aut] (ORCID: ), + Florencia D'Andrea [ctb], + Nadine Hussein [ctb] (ORCID: ), + Evan Amies-Galonski [ctb] (ORCID: + ), + Poisson Consulting [cph, fnd] +Maintainer: Joe Thorley diff --git a/chk.Rcheck/00_pkg_src/chk/LICENSE b/chk.Rcheck/00_pkg_src/chk/LICENSE new file mode 100644 index 00000000..1c0f20bf --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/LICENSE @@ -0,0 +1,2 @@ +YEAR: 2024 +COPYRIGHT HOLDER: Poisson Consulting diff --git a/chk.Rcheck/00_pkg_src/chk/NAMESPACE b/chk.Rcheck/00_pkg_src/chk/NAMESPACE new file mode 100644 index 00000000..55be724a --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/NAMESPACE @@ -0,0 +1,187 @@ +# Generated by roxygen2: do not edit by hand + +export(abort_chk) +export(backtick_chk) +export(cc) +export(check_data) +export(check_dim) +export(check_dirs) +export(check_files) +export(check_key) +export(check_length) +export(check_names) +export(check_values) +export(chk_all) +export(chk_all_equal) +export(chk_all_equivalent) +export(chk_all_identical) +export(chk_array) +export(chk_atomic) +export(chk_character) +export(chk_character_or_factor) +export(chk_chr) +export(chk_compatible_lengths) +export(chk_complex) +export(chk_complex_number) +export(chk_count) +export(chk_data) +export(chk_date) +export(chk_date_time) +export(chk_datetime) +export(chk_dbl) +export(chk_dir) +export(chk_dirs) +export(chk_double) +export(chk_environment) +export(chk_equal) +export(chk_equivalent) +export(chk_ext) +export(chk_factor) +export(chk_false) +export(chk_file) +export(chk_files) +export(chk_flag) +export(chk_function) +export(chk_gt) +export(chk_gte) +export(chk_has) +export(chk_identical) +export(chk_in) +export(chk_integer) +export(chk_is) +export(chk_join) +export(chk_length) +export(chk_lgl) +export(chk_list) +export(chk_logical) +export(chk_lt) +export(chk_lte) +export(chk_match) +export(chk_matrix) +export(chk_missing) +export(chk_named) +export(chk_no_missing) +export(chk_not_any_na) +export(chk_not_empty) +export(chk_not_missing) +export(chk_not_null) +export(chk_not_subset) +export(chk_null) +export(chk_null_or) +export(chk_number) +export(chk_numeric) +export(chk_off) +export(chk_on) +export(chk_orderset) +export(chk_proportion) +export(chk_range) +export(chk_raw) +export(chk_s3_class) +export(chk_s4_class) +export(chk_scalar) +export(chk_setequal) +export(chk_sorted) +export(chk_string) +export(chk_subset) +export(chk_superset) +export(chk_true) +export(chk_tz) +export(chk_unique) +export(chk_unused) +export(chk_used) +export(chk_valid_name) +export(chk_vector) +export(chk_whole_number) +export(chk_whole_numeric) +export(chk_wnum) +export(chkor) +export(chkor_vld) +export(deparse_backtick) +export(deparse_backtick_chk) +export(err) +export(expect_chk_error) +export(is_chk_on) +export(message_chk) +export(msg) +export(p) +export(p0) +export(unbacktick_chk) +export(vld_all) +export(vld_all_equal) +export(vld_all_equivalent) +export(vld_all_identical) +export(vld_array) +export(vld_atomic) +export(vld_character) +export(vld_character_or_factor) +export(vld_chr) +export(vld_compatible_lengths) +export(vld_complex) +export(vld_complex_number) +export(vld_count) +export(vld_data) +export(vld_date) +export(vld_date_time) +export(vld_datetime) +export(vld_dbl) +export(vld_dir) +export(vld_double) +export(vld_environment) +export(vld_equal) +export(vld_equivalent) +export(vld_ext) +export(vld_factor) +export(vld_false) +export(vld_file) +export(vld_flag) +export(vld_function) +export(vld_gt) +export(vld_gte) +export(vld_identical) +export(vld_integer) +export(vld_is) +export(vld_join) +export(vld_length) +export(vld_lgl) +export(vld_list) +export(vld_logical) +export(vld_lt) +export(vld_lte) +export(vld_match) +export(vld_matrix) +export(vld_missing) +export(vld_named) +export(vld_no_missing) +export(vld_not_any_na) +export(vld_not_empty) +export(vld_not_missing) +export(vld_not_null) +export(vld_not_subset) +export(vld_null) +export(vld_number) +export(vld_numeric) +export(vld_orderset) +export(vld_range) +export(vld_raw) +export(vld_s3_class) +export(vld_s4_class) +export(vld_scalar) +export(vld_setequal) +export(vld_sorted) +export(vld_string) +export(vld_subset) +export(vld_superset) +export(vld_true) +export(vld_tz) +export(vld_unique) +export(vld_unused) +export(vld_used) +export(vld_valid_name) +export(vld_vector) +export(vld_whole_number) +export(vld_whole_numeric) +export(vld_wnum) +export(wrn) +import(lifecycle) +import(rlang) +importFrom(lifecycle,deprecated) diff --git a/chk.Rcheck/00_pkg_src/chk/NEWS.md b/chk.Rcheck/00_pkg_src/chk/NEWS.md new file mode 100644 index 00000000..311ed364 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/NEWS.md @@ -0,0 +1,282 @@ + + +# chk 0.10.0.9012 + +## Continuous integration + +- Install binaries from r-universe for dev workflow (#206). + + +# chk 0.10.0.9011 + +## Continuous integration + +- Fix reviewdog and add commenting workflow (#204). + + +# chk 0.10.0.9010 + +## Continuous integration + +- Use workflows for fledge (#202). + + +# chk 0.10.0.9009 + +## Continuous integration + +- Sync (#200). + + +# chk 0.10.0.9008 + +## Chore + +- Auto-update from GitHub Actions (#194). + +## Continuous integration + +- Use reviewdog for external PRs (#195). + + +# chk 0.10.0.9007 + +## Continuous integration + +- Format with air, check detritus, better handling of `extra-packages` (#192). + + +# chk 0.10.0.9006 + +- Remove internal str2lang() function. (#97, #189). + + +# chk 0.10.0.9005 + +- Merge pull request #187 from poissonconsulting/chkiserrmsg. + +- Add R 4.0. + + +# chk 0.10.0.9004 + +## Continuous integration + +- Enhance permissions for workflow (#183). + + +# chk 0.10.0.9003 + +## Continuous integration + +- Permissions, better tests for missing suggests, lints (#181). + + +# chk 0.10.0.9002 + +## Continuous integration + +- Always use `_R_CHECK_FORCE_SUGGESTS_=false` (#178). + +## fledge + +- Bump version to 0.10.0.9001 (#176). + + +# chk 0.10.0.9001 + +## Continuous integration + +- Correct installation of xml2 (#175). + +- Sync (#173). + + +# chk 0.10.0.9000 + +- Switching to development version. + + +# chk 0.10.0 + +- Added `chk_complex()` and `vld_complex()`. (#158). +- Added `chk_raw()` and `vld_raw()` (#157). +- Added `check_length()`. +- Soft-deprecated `chk_lgl()` for `chk_scalar()` and `chk_logical()`. +- Fixed nested backticks so that error messages only have one set of backticks. + +# chk 0.9.2 + +- No longer officially supports R 3.6 as dependency `evaluate` of suggested dependency `testthat` switched to 4.0. +- `check_key()` now preserves active status of `sfc` column of `sf` object. +- Fixed `vld_join(by = NULL)` with R 4.5. + +# chk 0.9.1 + +- Fixes incorrect error message with `chk_null_or()` when `vld = chk::vld_xx`. + + +# chk 0.9.0 + +- Added `chk_compatible_lengths()` and `vld_compatible_lengths()` to check that lengths of objects are 'strictly recyclable'. +- Added `inclusive = TRUE` argument to `chk_range()`. +- Added `upper` argument to `chk_length()`. +- `vld_sorted()` and `chk_sorted()` now ignore missing values. +- Soft deprecated `.subclass` for `class` argument in `err()`, `wrn()` and `msg()`. + + +# chk 0.8.1 + +- Fixed bug where`check_key()` failing on sf objects. + + +# chk 0.8.0 + +- Updated deprecated argument `.subclass` to `class` in rlang function calls +- Added `chk_valid_name()`. +- Fixed `chk_join()` with `sf` data frames. + + +# chk 0.7.0 + +## Added + +- Added `chkor_vld()` as faster replacement for soft-deprecated `chkor()`. +- Sped up `chk_null_or()` by soft-deprecating `chk` argument for `vld` argument. +- Un-deprecated `chk_count()` and `chk_length()` because so useful. +- Updated error messages to precede objects which are described by their class by 'the y object of class'. + +## Fixed + +- `chk_null_or()` now returns (invisible) x. + +## Deprecated + +- Soft deprecated `chkor()` for `chkor_vld()` as slow. +- Soft deprecated `chk` argument of `chk_null_or()` for `vld` argument. +- Soft deprecated `chk_chr()`, `chk_dbl()` and `chk_wnum()` and `vld_` equivalents. +- Warn deprecated `chk_count()`, `chk_dirs()`, `chk_files()`, `chk_has()`, `chk_in()`, `chk_length()`, `chk_no_missing()`, `vld_no_missing()`, `chk_proportion()` +- Stop deprecated `chk_off()`, `chk_on()`, `is_chk_on()`, + +# chk 0.6.0 + +- All `chk_xx()` functions now return invisible copy of x (if passes check). +- Fixed bug in `check_key()` and `check_data()` when key is undefined for `sf `objects. +- `chk_whole_numeric()` now accepts `Inf` values. +- Removed `LazyData: true` for DESCRIPTION file to avoid CRAN check note. + +# chk 0.5.0 + +- Added `chk_null_or()`. +- Added `chk_wnum()` to check whole numeric scalars. +- Added `chk_dbl()` to check double scalars. +- Added `chk_chr()` to check character scalars. +- Added `chk_not_subset()` to check not a subset. +- Added `chk_factor()` to check factor vector. +- Added `chk_character_or_factor()` factor or character vector. +- Added `check_files()` and `check_dirs()` to check if all files or directories exist (or not). +- Added `chk_setordered()` to check order of elements in set. + +- `check_values()` now checks factor levels. +- Undeprecated `chk_is()` as useful for R6 objects. +- Soft-deprecated `chk_datetime()` for `chk_date_time()`. + +# chk 0.4.0 + +- Added following checks + - `check_names()`. + - `check_dim()`. + - `check_values()`. + - `check_key()`. + - `check_data()`. + +- Added following typeof chks + - `chk_logical()` and `vld_logical()`. + - `chk_double()` and `vld_double()`. + - `chk_integer()` and `vld_integer()`. + - `chk_character()` and `vld_character()`. + +- Added miscellaneous chks + - `chk_data()` and `vld_data()`. + - `chk_join()`. + +- Fixed + - `chk_vector()` and `vld_vector()` so ignores attributes. + +# chk 0.3.1 + +- Added `expect_chk_error()`. +- Added `chk_matrix()` and `vld_matrix()`. +- Added `chk_array()` and `vld_array()`. +- `abort_chk` now allows original arguments to be attached. +- Added `chk_tz()` and `vld_tz()`. +- Added `chk_matrix()` and `vld_matrix()`. +- Added `chk_array()` and `vld_array()`. +- Added `expect_chk_error()`. + +# chk 0.3.0 + +- Added `chk_sorted()` and `vld_sorted()`. + +# chk 0.2.1 + +## Minor Changes + +- Removed `chk-benchmarking.Rmd` vignette that was causing problems for many CRAN checks. + +# chk 0.2.0 + +## Major Changes + +- Added `x_name = NULL` argument to relevant `chk_` functions. +- Replaced `err = FALSE` variant with `vld_` variant. +- Switched from `stop()`, `warning()` and `message()` to rlang variants `abort()`, `warn()` and `inform()`. +- All error messages now start with x_name. +- Err capitalizes first character and adds missing period (tidyverse style). + +## New Functions + +- `chk_all()` +- `chk_atomic()` +- `chk_environment()` +- `chk_ext()` +- `chk_has()` +- `chk_not_empty()` +- `chk_s3_class()` +- `chk_s4_class()` +- `chk_setequal()` + +## Newly Exported Functions + +- `backtick_chk()` +- `unbacktick_chk()`. + +## New Arguments + +- `formals` argument to `chk_function()`. +- `tidy = TRUE` argument to errors, warnings and messages. +- `n = NULL` and `call. = FALSE` args to error message generating functions. +- `ellipsis = 10L` argument to `cc()`. +- `sep = ", "` arg to `cc()`. +- `incomparables = FALSE` argument to `chk_unique()`. +- `%y` to sprintf-like types. + +## (Soft) Deprecated Functions + +- `chk_no_missing()` for `chk_not_any_na()`. +- `chk_files()` and `chk_dirs()` for `chk_all(x, chk_file)` etc. +- `deparse_backtick()` for `deparse_backtick_chk()`. + +- `chk_length()`, `chk_proportion()` and `chk_count()`. +- `chk_on()`, `chk_off()` and `is_chk_on()`. + +## Minor Changes + +- Changed `chk_match()` so ignores missing values. +- Changed `chk_true()` (and `chk_false()`) to same behavior as `isTRUE` in R >= 3.5. +- Extended `chk_unique()` to handle `incomparables != FALSE` with data frames. +- Changed to `range = c(0,1)` for `chk_range()`. + +# chk 0.0.1 + +- Initial release. diff --git a/chk.Rcheck/00_pkg_src/chk/R/aaa.R b/chk.Rcheck/00_pkg_src/chk/R/aaa.R new file mode 100644 index 00000000..b48ecc34 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/aaa.R @@ -0,0 +1,12 @@ +#' Workaround: Avoid backtraces in examples +#' +#' This example will run first and set the option for the process that builds +#' the example. +#' (By default, pkgdown builds in a separate process.) +#' This also produces a help page that isn't linked from anywhere. +#' +#' @name aaa +#' @keywords internal +#' @examples +#' options(rlang_backtrace_on_error = "none") +NULL diff --git a/chk.Rcheck/00_pkg_src/chk/R/cc.R b/chk.Rcheck/00_pkg_src/chk/R/cc.R new file mode 100644 index 00000000..06c787a8 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/cc.R @@ -0,0 +1,54 @@ +#' Concatenate with Commas +#' +#' Concatenates object values into a string with each value separated by a comma +#' and the last value separated by a conjunction. +#' +#' By default, if x has more than 10 values an ellipsis is used +#' to ensure only 10 values are displayed (including the ellipsis). +#' +#' @param x The object to concatenate. +#' @param conj A string of the conjunction to separate the last value by. +#' @param sep A string of the separator. +#' @param brac A string to brac the values by. +#' @param ellipsis A numeric scalar of the maximum number of values to display +#' before using an ellipsis. +#' @param chk A flag specifying whether to check the other parameters. +#' +#' @return A string. +#' @export +#' +#' @examples +#' cc(1:2) +#' cc(1:2, conj = " or") +#' cc(3:1, brac = "'") +#' cc(1:11) +#' cc(as.character(1:2)) +cc <- function(x, conj = ", ", sep = ", ", + brac = if (is.character(x) || is.factor(x)) "'" else "", + ellipsis = 10L, chk = TRUE) { + if (chk) { + chk_string(conj) + chk_string(sep) + chk_s3_class(brac, "character") + chk_range(length(brac), 1:2) + chk_whole_number(ellipsis) + chk_gte(ellipsis, 3) + } + + if (!length(x)) { + return(character(0)) + } + x <- p0(brac[1], x, brac[length(brac)]) + n <- length(x) + if (n == 1L) { + return(x) + } + if (n == 2L) { + return(p(x, collapse = conj)) + } + if (n > ellipsis) { + x <- c(x[1:(ellipsis - 2)], "...", x[n]) + n <- ellipsis + } + p(c(p0(x[1:(n - 1)], collapse = sep), x[n]), collapse = conj) +} diff --git a/chk.Rcheck/00_pkg_src/chk/R/check-data.R b/chk.Rcheck/00_pkg_src/chk/R/check-data.R new file mode 100644 index 00000000..6cf33da7 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/check-data.R @@ -0,0 +1,46 @@ +#' Check Data +#' +#' @description +#' Checks column names, values, number of rows and key for a data.frame. +#' +#' @inheritParams params +#' @param values A uniquely named list of atomic vectors of the column values. +#' @return An informative error if the test fails or an invisible copy of x. +#' +#' @family check +#' +#' @export +#' @examples +#' check_data(data.frame()) +#' check_data(data.frame(x = 2), list(x = 1)) +#' try(check_data(data.frame(x = 2), list(y = 1L))) +#' try(check_data(data.frame(x = 2), list(y = 1))) +#' try(check_data(data.frame(x = 2), nrow = 2)) +check_data <- function(x, values = NULL, exclusive = FALSE, order = FALSE, nrow = numeric(0), key = character(0), x_name = NULL) { + chk_data(x, "data.frame") + + if (is.null(values)) values <- structure(list(), .Names = character(0)) + chk_list(values) + chk_named(values) + chk_unique(names(values)) + chk_all(values, chk_fun = chk_atomic) + + if (is.null(x_name)) x_name <- deparse_backtick_chk((substitute(x))) + chk_string(x_name) + + check_dim(x, + dim = base::nrow, values = nrow, x_name = x_name, + dim_name = "nrow" + ) + check_names(x, + names = names(values), exclusive = exclusive, + order = order, x_name = x_name + ) + lapply(names(values), function(name) { + check_values(x[[name]], values[[name]], + x_name = backtick_chk(p0(unbacktick_chk(x_name), "$", name)) + ) + }) + check_key(x, key = key, x_name = x_name) + invisible(x) +} diff --git a/chk.Rcheck/00_pkg_src/chk/R/check-dim.R b/chk.Rcheck/00_pkg_src/chk/R/check-dim.R new file mode 100644 index 00000000..399a676b --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/check-dim.R @@ -0,0 +1,53 @@ +#' Check Dimension +#' +#' @description +#' Checks dimension of an object. +#' +#' @inheritParams params +#' @param dim A function returning a non-negative whole number of the dimension. +#' @param values A flag or a whole numeric vector of the value, value range or possible values. +#' @param dim_name A string of the name of the dim function. +#' @return An informative error if the test fails or an invisible copy of x. +#' +#' @family check +#' +#' @examples +#' check_dim(1) +#' try(check_dim(1, values = FALSE)) +#' try(check_dim(1, values = c(10, 2))) +#' try(check_dim(data.frame(x = 1), dim = nrow, values = c(10, 10, 2))) +#' @export +check_dim <- function(x, dim = length, values = numeric(0), x_name = NULL, dim_name = NULL) { + chk_function(dim) + if (!vld_flag(values) && !vld_whole_numeric(values)) { + chkor_vld(vld_flag(values), vld_whole_numeric(values)) + } + chk_whole_number(dim(x)) + chk_gte(dim(x)) + + if (is.null(x_name)) x_name <- deparse((substitute(x))) + chk_string(x_name) + if (is.null(dim_name)) dim_name <- deparse((substitute(dim))) + chk_string(dim_name) + + x_name <- backtick_chk(p0(dim_name, "(", x_name, ")")) + + if (!length(values)) { + return(invisible(x)) + } + + if (vld_true(values)) { + return(chk_gt(dim(x), x_name = x_name)) + } + if (vld_false(values)) values <- 0L + if (identical(length(values), 2L)) { + if (!identical(values[1], values[2])) { + return(chk_range(dim(x), sort(values), x_name = x_name)) + } + values <- unique(values) + } + if (identical(length(values), 1L)) { + return(chk_equal(dim(x), values, x_name = x_name)) + } + chk_subset(dim(x), sort(unique(values)), x_name = x_name) +} diff --git a/chk.Rcheck/00_pkg_src/chk/R/check-dirs.R b/chk.Rcheck/00_pkg_src/chk/R/check-dirs.R new file mode 100644 index 00000000..31606fd4 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/check-dirs.R @@ -0,0 +1,36 @@ +#' Check Directories Exist +#' +#' @description +#' Checks if all directories exist (or if exists = FALSE do not exist as directories or files). +#' +#' @inheritParams params +#' @return An informative error if the test fails or an invisible copy of x. +#' +#' @family check +#' +#' @examples +#' check_dirs(tempdir()) +#' try(check_dirs(tempdir(), exists = FALSE)) +#' @export +check_dirs <- function(x, exists = TRUE, x_name = NULL) { + if (is.null(x_name)) x_name <- deparse_backtick_chk((substitute(x))) + chk_string(x_name) + chk_character(x, x_name = x_name) + chk_vector(x, x_name = x_name) + chk_not_any_na(x, x_name = x_name) + chk_flag(exists) + + dirs <- vapply(x, vld_file, TRUE) + if (any(dirs)) { + abort_chk(x_name, " must specify directories ('", x[dirs][1], "' is a file)", x = x) + } + x <- x[vapply(x, vld_dir, TRUE) != exists] + if (!length(x)) { + return(invisible(x)) + } + x <- x[1] + if (exists) { + abort_chk(x_name, " must specify existing directories ('", x, "' can't be found)", x = x) + } + abort_chk(x_name, " must not specify existing directories ('", x, "' exists)", x = x) +} diff --git a/chk.Rcheck/00_pkg_src/chk/R/check-files.R b/chk.Rcheck/00_pkg_src/chk/R/check-files.R new file mode 100644 index 00000000..d7b16719 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/check-files.R @@ -0,0 +1,36 @@ +#' Check Files Exist +#' +#' @description +#' Checks if all files exist (or if exists = FALSE do not exist as files or directories). +#' +#' @inheritParams params +#' @return An informative error if the test fails or an invisible copy of x. +#' +#' @family check +#' +#' @examples +#' check_files(tempfile("unlikely-that-exists-chk"), exists = FALSE) +#' try(check_files(tempfile("unlikely-that-exists-chk"))) +#' @export +check_files <- function(x, exists = TRUE, x_name = NULL) { + if (is.null(x_name)) x_name <- deparse_backtick_chk((substitute(x))) + chk_string(x_name) + chk_character(x, x_name = x_name) + chk_vector(x, x_name = x_name) + chk_not_any_na(x, x_name = x_name) + chk_flag(exists) + + dirs <- vapply(x, vld_dir, TRUE) + if (any(dirs)) { + abort_chk(x_name, " must specify files ('", x[dirs][1], "' is a directory)", x = x) + } + x <- x[vapply(x, vld_file, TRUE) != exists] + if (!length(x)) { + return(invisible(x)) + } + x <- x[1] + if (exists) { + abort_chk(x_name, " must specify existing files ('", x, "' can't be found)", x = x) + } + abort_chk(x_name, " must not specify existing files ('", x, "' exists)", x = x) +} diff --git a/chk.Rcheck/00_pkg_src/chk/R/check-key.R b/chk.Rcheck/00_pkg_src/chk/R/check-key.R new file mode 100644 index 00000000..a32a723b --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/check-key.R @@ -0,0 +1,42 @@ +#' Check Key +#' +#' @description +#' Checks if columns have unique rows. +#' +#' @inheritParams params +#' @param key A character vector of the columns that represent a unique key. +#' @param na_distinct A flag specifying whether missing values should be considered distinct. +#' @return An informative error if the test fails or an invisible copy of x. +#' +#' @family check +#' +#' @examples +#' x <- data.frame(x = c(1, 2), y = c(1, 1)) +#' check_key(x) +#' try(check_key(x, "y")) +#' @export +check_key <- function(x, key = character(0), na_distinct = FALSE, x_name = NULL) { + chk_data(x) + chk_s3_class(key, "character") + if (!length(key)) { + return(invisible(x)) + } + + chk_unique(key) + chk_not_any_na(key) + chk_flag(na_distinct) + + if (is.null(x_name)) x_name <- deparse_backtick_chk((substitute(x))) + chk_string(x_name) + + check_names(x, key, x_name = x_name) + + # to ensure not tripped up by sf objects. + x2 <- as.data.frame(x) + + incomparables <- if (na_distinct) NA else FALSE + if (any(new_duplicated(x2[key], incomparables = incomparables))) { + abort_chk("Column%s ", cc(key, conj = " and "), " in ", x_name, " must be a unique key.", n = length(key)) + } + invisible(x) +} diff --git a/chk.Rcheck/00_pkg_src/chk/R/check-length.R b/chk.Rcheck/00_pkg_src/chk/R/check-length.R new file mode 100644 index 00000000..26fcb315 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/check-length.R @@ -0,0 +1,20 @@ +#' Check Length +#' +#' @description +#' Checks length of an object. +#' +#' @inheritParams params +#' @param values A flag or a whole numeric vector of the value, value range or possible values. +#' @return An informative error if the test fails or an invisible copy of x. +#' +#' @family check +#' +#' @examples +#' check_length(1) +#' try(check_length(1, values = FALSE)) +#' try(check_length(1, values = c(10, 2))) +#' @export +check_length <- function(x, values = numeric(0), x_name = NULL) { + if (is.null(x_name)) x_name <- deparse((substitute(x))) + check_dim(x, values = values, x_name = x_name, dim_name = "length") +} diff --git a/chk.Rcheck/00_pkg_src/chk/R/check-names.R b/chk.Rcheck/00_pkg_src/chk/R/check-names.R new file mode 100644 index 00000000..8cb69906 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/check-names.R @@ -0,0 +1,54 @@ +#' Check Names +#' +#' @description +#' Checks the names of an object. +#' +#' @inheritParams params +#' @param names A character vector of the required names. +#' @param exclusive A flag specifying whether x must only contain the required names. +#' @param order A flag specifying whether the order of the required names in x must match the order in names. +#' @return An informative error if the test fails or an invisible copy of x. +#' +#' @family check +#' +#' @examples +#' x <- c(x = 1, y = 2) +#' check_names(x, c("y", "x")) +#' try(check_names(x, c("y", "x"), order = TRUE)) +#' try(check_names(x, "x", exclusive = TRUE)) +#' @export +check_names <- function(x, names = character(0), exclusive = FALSE, order = FALSE, + x_name = NULL) { + chk_s3_class(names, "character") + chk_unique(names) + chk_not_any_na(names) + chk_flag(exclusive) + chk_flag(order) + if (is.null(x_name)) x_name <- deparse_backtick_chk((substitute(x))) + chk_string(x_name) + chk_named(x, x_name = x_name) + + x_names <- names(x) + + if (!length(names)) { + if (exclusive && length(x_names)) { + abort_chk(x_name, " must not have any elements") + } + return(invisible(x)) + } + + x_name <- backtick_chk(p0("names(", unbacktick_chk(x_name), ")")) + + if (length(setdiff(names, x_names))) { + abort_chk(x_name, " must include ", cc(setdiff(names, x_names), conj = " and ")) + } + + if (exclusive && length(setdiff(x_names, names))) { + abort_chk(x_name, " must not include ", cc(setdiff(x_names, names), conj = " or ")) + } + + if (order && !identical(intersect(names, x_names), intersect(x_names, names))) { + abort_chk(x_name, " must include ", cc(names, conj = " and "), " in that order") + } + invisible(x) +} diff --git a/chk.Rcheck/00_pkg_src/chk/R/check-values.R b/chk.Rcheck/00_pkg_src/chk/R/check-values.R new file mode 100644 index 00000000..52552c6e --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/check-values.R @@ -0,0 +1,77 @@ +#' Check Values and Class +#' +#' @description +#' Checks values and S3 class of an atomic object. +#' +#' @details +#' To check the class simply pass a vector of the desired class. +#' +#' To check that x does not include missing values pass +#' a single non-missing value (of the correct class). +#' +#' To allow it to include missing values include a missing value. +#' +#' To check that it only includes missing values only pass +#' a missing value (of the correct class). +#' +#' To check the range of the values in x pass two non-missing values +#' (as well as the missing value if required). +#' +#' To check that x only includes specific values +#' pass three or more non-missing values. +#' +#' In the case of a factor ensure values has two levels to +#' check that the levels of x are an ordered superset of the levels of value +#' and three or more levels to check that they are identical. +#' +#' @inheritParams params +#' @param values An atomic vector specifying the S3 class and possible values. +#' @return An informative error if the test fails or an invisible copy of x. +#' +#' @family check +#' +#' @examples +#' check_values(1, numeric(0)) +#' check_values(1, 2) +#' try(check_values(1, 1L)) +#' try(check_values(NA_real_, 1)) +#' @export +check_values <- function(x, values, x_name = NULL) { + if (is.null(x_name)) x_name <- deparse_backtick_chk((substitute(x))) + chk_string(x_name) + chk_atomic(x, x_name = x_name) + chk_vector(values) + chk_atomic(values) + + class <- class(values)[1] + chk_s3_class(x, class, x_name = x_name) + if (is.factor(values) && nlevels(values) > 1) { + x_name_levels <- backtick_chk(p0("levels(", unbacktick_chk(x_name), ")")) + if (nlevels(values) > 2) { + chk_identical(levels(x), levels(values), x_name = x_name_levels) + } else { + chk_superset(levels(x), levels(values), x_name = x_name_levels) + chk_orderset(levels(x), levels(values), x_name = x_name_levels) + } + } + if (!length(x) || !length(values)) { + return(invisible(x)) + } + if (vld_not_any_na(values)) chk_not_any_na(x, x_name = x_name) + x <- x[!is.na(x)] + values <- values[!is.na(values)] + if (!length(x) || length(values) < 2) { + return(invisible(x)) + } + if (identical(length(values), 2L)) { + values <- sort(unique(values)) + if (identical(length(values), 1L)) { + return(chk_all(x, chk_equal, values, x_name = x_name)) + } + if (is.factor(values) && (nlevels(values) < 3 || !is.ordered(values))) { + return(invisible()) + } + return(chk_range(x, values, x_name = x_name)) + } + chk_subset(x, sort(unique(values)), x_name = x_name) +} diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-all-equal.R b/chk.Rcheck/00_pkg_src/chk/R/chk-all-equal.R new file mode 100644 index 00000000..385ba9e8 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-all-equal.R @@ -0,0 +1,42 @@ +#' Check All Equal +#' +#' @description +#' Checks all elements in x equal using +#' +#' `length(x) < 2L || all(vapply(x, vld_equal, TRUE, y = x[[1]], tolerance = tolerance))` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family equal_checkers +#' @family all_checkers +#' @seealso [length()] +#' @seealso [vld_equal()] +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_all_equal +#' chk_all_equal(c(1, 1.00000001)) +#' try(chk_all_equal(c(1, 1.0000001))) +#' chk_all_equal(list(c(x = 1), c(x = 1))) +#' try(chk_all_equal(list(c(x = 1), c(y = 1)))) +#' @export +chk_all_equal <- function(x, tolerance = sqrt(.Machine$double.eps), x_name = NULL) { + if (vld_all_equal(x, tolerance = tolerance)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + abort_chk(x_name, " must have equal elements", x = x, tolerance = tolerance) +} + +#' @describeIn chk_all_equal Validate All Equal +#' +#' @examples +#' # vld_all_equal +#' vld_all_equal(c(1, 1L)) +#' @export +vld_all_equal <- function(x, tolerance = sqrt(.Machine$double.eps)) { + length(x) < 2L || all(vapply(x, vld_equal, TRUE, y = x[[1]], tolerance = tolerance)) +} diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-all-equivalent.R b/chk.Rcheck/00_pkg_src/chk/R/chk-all-equivalent.R new file mode 100644 index 00000000..2dee961e --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-all-equivalent.R @@ -0,0 +1,43 @@ +#' Check All Equivalent +#' +#' @description +#' Checks all elements in x equivalent using +#' +#' `length(x) < 2L || all(vapply(x, vld_equivalent, TRUE, y = x[[1]], tolerance = tolerance))` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family equal_checkers +#' @family all_checkers +#' +#' @seealso [length()] +#' @seealso [vld_equivalent()] +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_all_equivalent +#' chk_all_equivalent(c(1, 1.00000001)) +#' try(chk_all_equivalent(c(1, 1.0000001))) +#' chk_all_equivalent(list(c(x = 1), c(x = 1))) +#' chk_all_equivalent(list(c(x = 1), c(y = 1))) +#' @export +chk_all_equivalent <- function(x, tolerance = sqrt(.Machine$double.eps), x_name = NULL) { + if (vld_all_equivalent(x, tolerance = tolerance)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + abort_chk(x_name, " must have equivalent elements", x = x, tolerance = tolerance) +} + +#' @describeIn chk_all_equivalent Validate All Equivalent +#' +#' @examples +#' # vld_all_equivalent +#' vld_all_equivalent(c(x = 1, y = 1)) +#' @export +vld_all_equivalent <- function(x, tolerance = sqrt(.Machine$double.eps)) { + length(x) < 2L || all(vapply(x, vld_equivalent, TRUE, y = x[[1]], tolerance = tolerance)) +} diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-all-identical.R b/chk.Rcheck/00_pkg_src/chk/R/chk-all-identical.R new file mode 100644 index 00000000..6575f843 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-all-identical.R @@ -0,0 +1,46 @@ +#' Check All Identical +#' +#' @description +#' Checks all elements in x identical using +#' +#' `length(x) < 2L || all(vapply(x, vld_identical, TRUE, y = x[[1]]))` +#' +#' +#' **Pass**: `c(1, 1, 1)`, `list(1, 1)` +#' +#' **Fail**: `c(1, 1.0000001)`, `list(1, NA)` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family equal_checkers +#' @family all_checkers +#' +#' @seealso [length()] +#' @seealso [vld_identical()] +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_all_identical +#' chk_all_identical(c(1, 1)) +#' try(chk_all_identical(c(1, 1.1))) +#' @export +chk_all_identical <- function(x, x_name = NULL) { + if (vld_all_identical(x)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + abort_chk(x_name, " must have identical elements", x = x) +} + +#' @describeIn chk_all_identical Validate All Identical +#' +#' @examples +#' # vld_all_identical +#' vld_all_identical(c(1, 1)) +#' @export +vld_all_identical <- function(x) { + length(x) < 2L || all(vapply(x, vld_identical, TRUE, y = x[[1]])) +} diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-all.R b/chk.Rcheck/00_pkg_src/chk/R/chk-all.R new file mode 100644 index 00000000..3f4e1f73 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-all.R @@ -0,0 +1,58 @@ +#' Check All +#' +#' @description +#' Checks all elements using +#' +#' `all(vapply(x, chk_fun, TRUE, ...))` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family all_checkers +#' +#' @seealso [all()] +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_all +#' chk_all(TRUE, chk_lgl) +#' # FIXME try(chk_all(1, chk_lgl)) +#' chk_all(c(TRUE, NA), chk_lgl) +#' @export +chk_all <- function(x, chk_fun, ..., x_name = NULL) { + if (is.null(x)) { + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + return(chk_fun(x, ..., x_name = x_name)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + x_name <- paste0("all elements of ", x_name) + + args <- list(...) + args$X <- x + args$FUN <- chk_fun + args$x_name <- x_name + + do.call("lapply", args) + invisible(x) +} + +#' @describeIn chk_all Validate All +#' +#' @examples +#' # vld_all +#' vld_all(c(TRUE, NA), vld_lgl) +#' @export +vld_all <- function(x, vld_fun, ...) { + if (is.null(x)) { + return(vld_fun(x, ...)) + } + + args <- list(...) + args$X <- x + args$FUN <- vld_fun + args$FUN.VALUE <- TRUE + + all(do.call("vapply", args)) +} diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-array.R b/chk.Rcheck/00_pkg_src/chk/R/chk-array.R new file mode 100644 index 00000000..bebe27f1 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-array.R @@ -0,0 +1,39 @@ +#' Check Array +#' +#' @description +#' Checks if is an array using +#' +#' `is.array(x)` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family data_structure_checkers +#' +#' @seealso [is.array()] +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_array +#' chk_array(array(1)) +#' try(chk_array(matrix(1))) +#' @export +chk_array <- function(x, x_name = NULL) { + if (vld_array(x)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + abort_chk(x_name, " must be an array", x = x) +} + +#' @describeIn chk_array Validate Array +#' +#' @examples +#' +#' # vld_array +#' vld_array(1) +#' vld_array(array(1)) +#' @export +vld_array <- function(x) is.array(x) diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-atomic.R b/chk.Rcheck/00_pkg_src/chk/R/chk-atomic.R new file mode 100644 index 00000000..251f9bc2 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-atomic.R @@ -0,0 +1,41 @@ +#' Check Atomic +#' +#' @description +#' Checks if atomic using +#' +#' `is.atomic(x)` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family data_structure_checkers +#' +#' @seealso [is.atomic()] +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_atomic +#' chk_atomic(1) +#' try(chk_atomic(list(1))) +#' @export +chk_atomic <- function(x, x_name = NULL) { + if (vld_atomic(x)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk((substitute(x))) + abort_chk(x_name, " must be atomic", x = x) +} + +#' @describeIn chk_atomic Validate Atomic +#' +#' @examples +#' # vld_atomic +#' vld_atomic(1) +#' vld_atomic(matrix(1:3)) +#' vld_atomic(character(0)) +#' vld_atomic(list(1)) +#' vld_atomic(NULL) +#' @export +vld_atomic <- function(x) is.atomic(x) diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-character-or-factor.R b/chk.Rcheck/00_pkg_src/chk/R/chk-character-or-factor.R new file mode 100644 index 00000000..93b1527b --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-character-or-factor.R @@ -0,0 +1,46 @@ +#' Check Character or Factor +#' +#' @description +#' Checks if character or factor using +#' +#' `is.character(x) || is.factor(x)` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family data_type_checkers +#' @family factor_checkers +#' +#' @seealso [is.character()] +#' @seealso [is.factor()] +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_character_or_factor +#' chk_character_or_factor("1") +#' chk_character_or_factor(factor("1")) +#' try(chk_character(1)) +#' @export +chk_character_or_factor <- function(x, x_name = NULL) { + if (vld_character_or_factor(x)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk((substitute(x))) + abort_chk(x_name, " must be character or factor", x = x) +} + +#' @describeIn chk_character_or_factor Validate Character or Factor +#' +#' @examples +#' # vld_character_or_factor +#' vld_character_or_factor("1") +#' vld_character_or_factor(matrix("a")) +#' vld_character_or_factor(character(0)) +#' vld_character_or_factor(NA_character_) +#' vld_character_or_factor(1) +#' vld_character_or_factor(TRUE) +#' vld_character_or_factor(factor("text")) +#' @export +vld_character_or_factor <- function(x) is.character(x) || is.factor(x) diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-character.R b/chk.Rcheck/00_pkg_src/chk/R/chk-character.R new file mode 100644 index 00000000..fd53db76 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-character.R @@ -0,0 +1,43 @@ +#' Check Character +#' +#' @description +#' Checks if character using +#' +#' `is.character(x)` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family data_type_checkers +#' +#' @seealso [is.character()] +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_character +#' chk_character("1") +#' try(chk_character(1)) +#' @export +chk_character <- function(x, x_name = NULL) { + if (vld_character(x)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk((substitute(x))) + abort_chk(x_name, " must be character", x = x) +} + +#' @describeIn chk_character Validate Character +#' +#' @examples +#' # vld_character +#' vld_character("1") +#' vld_character(matrix("a")) +#' vld_character(character(0)) +#' vld_character(NA_character_) +#' vld_character(1) +#' vld_character(TRUE) +#' vld_character(factor("text")) +#' @export +vld_character <- function(x) is.character(x) diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-chr.R b/chk.Rcheck/00_pkg_src/chk/R/chk-chr.R new file mode 100644 index 00000000..92332c6c --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-chr.R @@ -0,0 +1,57 @@ +#' Check Character Scalar +#' +#' @description +#' Checks if character scalar using +#' +#' `is.character(x) && length(x) == 1L` +#' +#' `r lifecycle::badge("deprecated")` +#' +#' @family deprecated +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family chk_character +#' +#' @examples +#' chk_chr("a") +#' try(chk_chr(1)) +#' @export +chk_chr <- function(x, x_name = NULL) { + if (vld_chr(x)) { + return(invisible(x)) + } + deprecate_soft( + "0.6.1", + what = "chk::chk_chr()", + details = "Please use `chk::chk_scalar(x);` `chk::chk_character(x)` instead", + id = "chk_chr" + ) + + if (is.null(x_name)) x_name <- deparse_backtick_chk((substitute(x))) + abort_chk(x_name, " must be a character scalar", x = x) +} + +#' @describeIn chk_chr Validate Character Scalar +#' +#' `r lifecycle::badge("deprecated")` +#' +#' @examples +#' # vld_chr +#' vld_chr("") +#' vld_chr("a") +#' vld_chr(NA_character_) +#' vld_chr(c("a", "b")) +#' vld_chr(1) +#' @export +vld_chr <- function(x) { + deprecate_soft( + "0.6.1", + what = "chk::chk_chr()", + details = "Please use `chk::chk_scalar(x);` `chk::chk_character(x)` instead", + id = "chk_chr" + ) + + is.character(x) && length(x) == 1L +} diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-compatible-lengths.R b/chk.Rcheck/00_pkg_src/chk/R/chk-compatible-lengths.R new file mode 100644 index 00000000..2f05947e --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-compatible-lengths.R @@ -0,0 +1,106 @@ +#' Check Compatible Lengths +#' +#' Checks objects (including vectors) have lengths that could be 'strictly +#' recycled'. That is to say they must all be either zero length or the same +#' length with some of length 1. +#' +#' @inheritParams params +#' @param ... The objects to check for compatible lengths. +#' @return The `chk_` function throws an informative error if the test fails. +#' @details This function helps to check vectors could be 'strictly recycled.' +#' For example the function will error if you had a vector of length 2 and +#' length 4, even though the vector of length 2 could be 'loosely recycled' to +#' match up to the vector of length 4 when combined. +#' +#' The intent of the function is to check that only strict recycling is +#' occurring. +#' +#' @family length_checkers +#' +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_compatible_lengths +#' +#' a <- integer(0) +#' b <- numeric(0) +#' chk_compatible_lengths(a, b) +#' +#' a <- 1 +#' b <- 2 +#' chk_compatible_lengths(a, b) +#' +#' a <- 1:3 +#' b <- 1:3 +#' chk_compatible_lengths(a, b) +#' +#' b <- 1 +#' chk_compatible_lengths(a, b) +#' +#' b <- 1:2 +#' try(chk_compatible_lengths(a, b)) +#' +#' b <- 1:6 +#' try(chk_compatible_lengths(a, b)) +#' @export +chk_compatible_lengths <- function(..., x_name = NULL) { + if (vld_compatible_lengths(...)) { + return(invisible()) + } + if (is.null(x_name)) { + x_name <- "... objects" + } + chk_string(x_name) + + vec_lengths <- lengths(list(...)) + length_set <- sort(unique(vec_lengths)) + + abort_chk( + x_name, + paste0( + " must be all zero length or the same length with some of length of 1 ", + "but not lengths " + ), + cc(length_set, conj = " and ") + ) +} + +#' @describeIn chk_compatible_lengths Validate Compatible Lengths +#' @export +#' @examples +#' # vld_compatible_lengths +#' +#' a <- integer(0) +#' b <- numeric(0) +#' vld_compatible_lengths(a, b) +#' +#' a <- 1 +#' b <- 2 +#' vld_compatible_lengths(a, b) +#' +#' a <- 1:3 +#' b <- 1:3 +#' vld_compatible_lengths(a, b) +#' +#' b <- 1 +#' vld_compatible_lengths(a, b) +#' +#' b <- 1:2 +#' vld_compatible_lengths(a, b) +#' +#' b <- 1:6 +#' vld_compatible_lengths(a, b) +vld_compatible_lengths <- function(...) { + vec_lengths <- lengths(list(...)) + length_set <- unique(vec_lengths) + + if (length(length_set) <= 1) { + return(TRUE) + } + if (length(length_set) >= 3) { + return(FALSE) + } + min(length_set) == 1 +} diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-complex-number.R b/chk.Rcheck/00_pkg_src/chk/R/chk-complex-number.R new file mode 100644 index 00000000..2379f6c5 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-complex-number.R @@ -0,0 +1,47 @@ +#' Check Complex Number +#' +#' @description +#' Checks if non-missing complex scalar using +#' +#' `is.complex(x) && length(x) == 1L && !anyNA(x)` +#' +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family scalar_checker +#' +#' @seealso [is.integer()] +#' @seealso [vld_true()] +#' @seealso [vld_number()] +#' +#' @seealso For more details about the use of this function, +#' please read the article +#' \href{https://poissonconsulting.github.io/chk/articles/chk-families.html}{chk families}. +#' +#' @examples +#' # chk_complex_number +#' chk_complex_number(as.complex(1.1)) +#' try(chk_complex_number(1.1)) +#' @export +chk_complex_number <- function(x, x_name = NULL) { + if (vld_complex_number(x)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + abort_chk( + x_name, + " must be a complex number (non-missing complex scalar)", + x = x + ) +} + +#' @describeIn chk_complex_number Validate Complex Number +#' +#' @examples +#' # vld_complex_number +#' vld_complex_number(as.complex(2)) +#' @export +vld_complex_number <- function(x) { + is.complex(x) && length(x) == 1L && !anyNA(x) +} diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-complex.R b/chk.Rcheck/00_pkg_src/chk/R/chk-complex.R new file mode 100644 index 00000000..20a19fed --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-complex.R @@ -0,0 +1,41 @@ +#' Check Complex +#' +#' @description +#' Checks if complex using +#' +#' `is.complex(x)` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family data_type_checkers +#' +#' @seealso [is.complex()] +#' @seealso For more details about the use of this function, +#' please read the article +#' \href{https://poissonconsulting.github.io/chk/articles/chk-families.html}{chk families}. +#' +#' @examples +#' # chk_complex +#' chk_complex(1i) +#' try(chk_complex(1)) +#' @export +chk_complex <- function(x, x_name = NULL) { + if (vld_complex(x)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk((substitute(x))) + abort_chk(x_name, " must be complex", x = x) +} + +#' @describeIn chk_complex Validate Complex +#' +#' @examples +#' # vld_complex +#' vld_complex(1i) +#' vld_complex(complex()) +#' vld_complex(NA_complex_) +#' vld_complex(1) +#' vld_complex(TRUE) +#' @export +vld_complex <- function(x) is.complex(x) diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-count.R b/chk.Rcheck/00_pkg_src/chk/R/chk-count.R new file mode 100644 index 00000000..9e6514cc --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-count.R @@ -0,0 +1,44 @@ +#' Check Count +#' +#' @description +#' Checks if non-negative whole number using +#' +#' `vld_whole_number(x) && x >= 0` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family scalar_checkers +#' @family whole_number_checkers +#' +#' @seealso [vld_whole_number()] +#' @seealso [length()] +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_count +#' chk_count(1) +#' try(chk_count(1.5)) +#' @export +chk_count <- function(x, x_name = NULL) { + if (vld_count(x)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk((substitute(x))) + abort_chk(x_name, " must be a count (non-negative non-missing integer scalar or double equivalent)", x = x) +} + +#' @describeIn chk_count Validate Count +#' +#' @examples +#' # vld_count +#' vld_count(1) +#' vld_count(0L) +#' vld_count(-1) +#' vld_count(0.5) +#' @export +vld_count <- function(x) { + vld_whole_number(x) && x >= 0 +} diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-data.R b/chk.Rcheck/00_pkg_src/chk/R/chk-data.R new file mode 100644 index 00000000..559a4804 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-data.R @@ -0,0 +1,43 @@ +#' Check Data +#' +#' @description +#' Checks data.frame using +#' +#' `inherits(x, "data.frame")` +#' +#' Note that there is a similar function, [check_data()], which checks +#' the column names, values, number of rows, and keys of a data.frame. +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family id_checkers +#' +#' @seealso [inherits()] +#' +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_data +#' chk_data(data.frame(x = 1)) +#' try(chk_data(1)) +#' @export +chk_data <- function(x, x_name = NULL) { + if (vld_data(x)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + abort_chk(x_name, " must be a data.frame", x = x) +} + +#' @describeIn chk_data Validate Data +#' +#' @examples +#' # vld_data +#' vld_data(data.frame()) +#' vld_data(data.frame(x = 1)) +#' vld_data(c(x = 1)) +#' @export +vld_data <- function(x) inherits(x, "data.frame") diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-date.R b/chk.Rcheck/00_pkg_src/chk/R/chk-date.R new file mode 100644 index 00000000..6f8c6412 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-date.R @@ -0,0 +1,41 @@ +#' Check Date +#' +#' @description +#' Checks non-missing Date scalar using +#' +#' `inherits(x, "Date") && length(x) == 1L && !anyNA(x)` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family scalar_checkers +#' @family datetime_checkers +#' +#' @seealso [inherits()] +#' @seealso [length()] +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_date +#' chk_date(Sys.Date()) +#' try(chk_date(1)) +#' @export +chk_date <- function(x, x_name = NULL) { + if (vld_date(x)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + abort_chk(x_name, " must be a date (non-missing Date scalar)", x = x) +} + +#' @describeIn chk_date Validate Date +#' +#' @examples +#' # vld_date +#' vld_date(Sys.Date()) +#' vld_date(Sys.time()) +#' vld_date(1) +#' @export +vld_date <- function(x) inherits(x, "Date") && length(x) == 1L && !anyNA(x) diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-datetime.R b/chk.Rcheck/00_pkg_src/chk/R/chk-datetime.R new file mode 100644 index 00000000..53d1564d --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-datetime.R @@ -0,0 +1,77 @@ +#' Check Date Time +#' +#' @description +#' Checks if non-missing POSIXct scalar using +#' +#' `inherits(x, "POSIXct") && length(x) == 1L && !anyNA(x)` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family scalar_checkers +#' @family datetime_checkers +#' +#' @seealso [inherits()], [length()] +#' +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_date_time +#' chk_date_time(as.POSIXct("2001-01-02")) +#' try(chk_date_time(1)) +#' @export +chk_date_time <- function(x, x_name = NULL) { + if (vld_date_time(x)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + abort_chk(x_name, " must be a date time (non-missing POSIXct scalar)", x = x) +} + +#' @describeIn chk_date_time Check Date Time (Deprecated) +#' +#' `r lifecycle::badge("deprecated")` +#' +#' @export +chk_datetime <- function(x, x_name = NULL) { + deprecate_warn("0.4.1", + what = "chk::chk_datetime()", + with = "chk::chk_date_time()", + id = "chk_datetime" + ) + if (vld_date_time(x)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + abort_chk(x_name, " must be a date time (non-missing POSIXct scalar)", x = x) +} + +#' @describeIn chk_date_time Validate Date Time +#' +#' @examples +#' # vld_date_time +#' vld_date_time(as.POSIXct("2001-01-02")) +#' vld_date_time(Sys.time()) +#' vld_date_time(1) +#' vld_date_time("2001-01-02") +#' vld_date_time(c(Sys.time(), Sys.time())) +#' @export +vld_date_time <- function(x) { + inherits(x, "POSIXct") && length(x) == 1L && !anyNA(x) +} + +#' @describeIn chk_date_time Validate Date Time (Deprecated) +#' +#' `r lifecycle::badge("deprecated")` +#' +#' @export +vld_datetime <- function(x) { + deprecate_warn("0.4.1", + what = "chk::vld_datetime()", + with = "chk::vld_date_time()", + id = "chk_datetime" + ) + vld_date_time(x) +} diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-dbl.R b/chk.Rcheck/00_pkg_src/chk/R/chk-dbl.R new file mode 100644 index 00000000..51c5cffd --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-dbl.R @@ -0,0 +1,56 @@ +#' Check Double Scalar +#' +#' @description +#' Checks if double scalar using +#' +#' `is.double(x) && length(x) == 1L` +#' +#' `r lifecycle::badge("deprecated")` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family deprecated +#' +#' @examples +#' # chk_dbl +#' chk_dbl(1) +#' try(chk_dbl(1L)) +#' @export +chk_dbl <- function(x, x_name = NULL) { + if (vld_dbl(x)) { + return(invisible(x)) + } + deprecate_soft( + "0.6.1", + what = "chk::chk_dbl()", + details = "Please use `chk::chk_scalar(x);` `chk::chk_double(x)` instead", + id = "chk_dbl" + ) + + if (is.null(x_name)) x_name <- deparse_backtick_chk((substitute(x))) + abort_chk(x_name, " must be double (real) scalar", x = x) +} + +#' @describeIn chk_dbl Validate Double +#' +#' `r lifecycle::badge("deprecated")` +#' +#' @examples +#' # vld_dbl +#' vld_dbl(1) +#' vld_dbl(double(0)) +#' vld_dbl(NA_real_) +#' vld_dbl(c(1, 1)) +#' vld_dbl(1L) +#' @export +vld_dbl <- function(x) { + deprecate_soft( + "0.6.1", + what = "chk::chk_dbl()", + details = "Please use `chk::chk_scalar(x);` `chk::chk_double(x)` instead", + id = "chk_dbl" + ) + + is.double(x) && length(x) == 1L +} diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-dir.R b/chk.Rcheck/00_pkg_src/chk/R/chk-dir.R new file mode 100644 index 00000000..94e58928 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-dir.R @@ -0,0 +1,44 @@ +#' Check Directory Exists +#' +#' @description +#' Checks if directory exists using +#' +#' `vld_string(x) && dir.exists(x)` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family file_checkers +#' +#' @seealso [vld_string()] +#' @seealso [dir.exists()] +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_dir +#' chk_dir(tempdir()) +#' try(chk_dir(tempfile())) +#' @export +chk_dir <- function(x, x_name = NULL) { + if (vld_dir(x)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + chk_string(x, x_name = x_name) + if (file.exists(x)) { + abort_chk(x_name, " must specify a directory ('", x, "' is a file)", x = x) + } + abort_chk(x_name, " must specify an existing directory ('", x, "' can't be found)", x = x) +} + +#' @describeIn chk_dir Validate Directory Exists +#' +#' @examples +#' # vld_dir +#' vld_dir(1) +#' vld_dir(tempdir()) +#' vld_dir(tempfile()) +#' @export +vld_dir <- function(x) vld_string(x) && dir.exists(x) diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-double.R b/chk.Rcheck/00_pkg_src/chk/R/chk-double.R new file mode 100644 index 00000000..866e4cfc --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-double.R @@ -0,0 +1,43 @@ +#' Check Double +#' +#' @description +#' Checks if double using +#' +#' `is.double(x)` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family data_type_checkers +#' +#' @seealso [is.double()] +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_double +#' chk_double(1) +#' try(chk_double(1L)) +#' @export +chk_double <- function(x, x_name = NULL) { + if (vld_double(x)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk((substitute(x))) + abort_chk(x_name, " must be double", x = x) +} + +#' @describeIn chk_double Validate Double +#' +#' @examples +#' # vld_double +#' vld_double(1) +#' vld_double(matrix(c(1, 2, 3, 4), nrow = 2L)) +#' vld_double(double(0)) +#' vld_double(numeric(0)) +#' vld_double(NA_real_) +#' vld_double(1L) +#' vld_double(TRUE) +#' @export +vld_double <- function(x) is.double(x) diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-environment.R b/chk.Rcheck/00_pkg_src/chk/R/chk-environment.R new file mode 100644 index 00000000..80d189c2 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-environment.R @@ -0,0 +1,41 @@ +#' Check Environment +#' +#' @description +#' Checks if environment using +#' +#' `is.environment(x)` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family data_type_checkers +#' +#' @seealso [is.environment()] +#' +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_environment +#' chk_environment(.GlobalEnv) +#' try(chk_environment(1)) +#' @export +chk_environment <- function(x, x_name = NULL) { + if (vld_environment(x)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk((substitute(x))) + abort_chk(x_name, " must be an environment", x = x) +} + +#' @describeIn chk_environment Validate Environment +#' +#' @examples +#' # vld_environment +#' vld_environment(1) +#' vld_environment(list(1)) +#' vld_environment(.GlobalEnv) +#' vld_environment(environment()) +#' @export +vld_environment <- function(x) is.environment(x) diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-equal.R b/chk.Rcheck/00_pkg_src/chk/R/chk-equal.R new file mode 100644 index 00000000..cba0c3dc --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-equal.R @@ -0,0 +1,48 @@ +#' Check Equal +#' +#' @description +#' Checks if is equal (identical within tolerance) to y using +#' +#' `vld_true(all.equal(x, y, tolerance))` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family equal_checkers +#' +#' @seealso [vld_true()] +#' @seealso [all.equal()] +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_equal +#' chk_equal(1, 1.00000001) +#' try(chk_equal(1, 1.0000001)) +#' chk_equal(1, 1L) +#' chk_equal(c(x = 1), c(x = 1L)) +#' try(chk_equal(c(x = 1), c(y = 1L))) +#' @export +chk_equal <- function(x, y, tolerance = sqrt(.Machine$double.eps), + x_name = NULL) { + if (vld_equal(x, y, tolerance = tolerance)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + y_name <- as_label(y) + obj_of <- if (grepl("^<", y_name)) "the y object of class " else NULL + abort_chk(x_name, " must be equal to ", + obj_of, y_name, + x = x, y = y + ) +} + +#' @describeIn chk_equal Validate Equal +#' +#' @examples +#' vld_equal(1, 1.00000001) +#' @export +vld_equal <- function(x, y, tolerance = sqrt(.Machine$double.eps)) { + vld_true(all.equal(x, y, tolerance)) +} diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-equivalent.R b/chk.Rcheck/00_pkg_src/chk/R/chk-equivalent.R new file mode 100644 index 00000000..7b90bb50 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-equivalent.R @@ -0,0 +1,47 @@ +#' Check Equivalent +#' +#' @description +#' Checks if is equivalent (equal ignoring attributes) to y using +#' +#' `vld_true(all.equal(x, y, tolerance, check.attributes = FALSE))` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family equal_checkers +#' +#' @seealso [vld_true()] +#' @seealso [all.equal()] +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_equivalent +#' chk_equivalent(1, 1.00000001) +#' try(chk_equivalent(1, 1.0000001)) +#' chk_equivalent(1, 1L) +#' chk_equivalent(c(x = 1), c(y = 1)) +#' @export +chk_equivalent <- function(x, y, tolerance = sqrt(.Machine$double.eps), + x_name = NULL) { + if (vld_equivalent(x, y, tolerance = tolerance)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + y_name <- as_label(y) + obj_of <- if (grepl("^<", y_name)) "the y object of class " else NULL + abort_chk(x_name, " must be equivalent to ", + obj_of, y_name, + x = x, y = y + ) +} + +#' @describeIn chk_equivalent Validate Equivalent +#' +#' @examples +#' vld_equivalent(c(x = 1), c(y = 1L)) +#' @export +vld_equivalent <- function(x, y, tolerance = sqrt(.Machine$double.eps)) { + vld_true(all.equal(x, y, tolerance, check.attributes = FALSE)) +} diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-ext.R b/chk.Rcheck/00_pkg_src/chk/R/chk-ext.R new file mode 100644 index 00000000..bd36af01 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-ext.R @@ -0,0 +1,46 @@ +#' Check File Extension +#' +#' @description +#' Checks extension using +#' +#' `vld_string(x) && vld_subset(tools::file_ext(x), ext)` +#' +#' The user may want to use [toupper()] or [tolower()] +#' to ensure the case matches. +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family file_checkers +#' +#' @seealso [vld_string()] +#' @seealso [vld_subset()] +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_ext +#' try(chk_ext("file1.pdf", "png")) +#' @export +chk_ext <- function(x, ext, x_name = NULL) { + if (vld_ext(x, ext)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + chk_string(x, x_name = x_name) + abort_chk( + x_name, " must have extension ", cc(ext, " or "), " (not '", + tools::file_ext(x), "')", + x = x, ext = ext + ) +} + +#' @describeIn chk_ext Validate File Extension +#' +#' @examples +#' # vld_ext +#' vld_ext("oeu.pdf", "pdf") +#' vld_ext(toupper("oeu.pdf"), "PDF") +#' @export +vld_ext <- function(x, ext) vld_string(x) && vld_subset(tools::file_ext(x), ext) diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-factor.R b/chk.Rcheck/00_pkg_src/chk/R/chk-factor.R new file mode 100644 index 00000000..e2a92ccf --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-factor.R @@ -0,0 +1,41 @@ +#' Check Factor +#' +#' @description +#' Checks if factor using +#' +#' `is.factor(x)` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family factor_checkers +#' @family data-type_checkers +#' +#' @seealso [is.factor()] +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_factor +#' chk_factor(factor("1")) +#' try(chk_factor("1")) +#' @export +chk_factor <- function(x, x_name = NULL) { + if (vld_factor(x)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk((substitute(x))) + abort_chk(x_name, " must be factor", x = x) +} + +#' @describeIn chk_factor Validate Factor +#' +#' @examples +#' # vld_factor +#' vld_factor(factor("1")) +#' vld_factor(factor(0)) +#' vld_factor("1") +#' vld_factor(1L) +#' @export +vld_factor <- function(x) is.factor(x) diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-false.R b/chk.Rcheck/00_pkg_src/chk/R/chk-false.R new file mode 100644 index 00000000..39c1e06c --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-false.R @@ -0,0 +1,43 @@ +#' Check FALSE +#' +#' @description +#' Check if FALSE using +#' +#' `is.logical(x) && length(x) == 1L && !anyNA(x) && !x` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family logical_checkers +#' @family scalar_checkers +#' +#' @seealso [is.logical()] +#' @seealso [length()] +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_false +#' chk_false(FALSE) +#' try(chk_false(0)) +#' @export +chk_false <- function(x, x_name = NULL) { + if (vld_false(x)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + abort_chk(x_name, " must be FALSE", x = x) +} + +#' @describeIn chk_false Validate FALSE +#' +#' @examples +#' # vld_false +#' vld_false(TRUE) +#' vld_false(FALSE) +#' vld_false(NA) +#' vld_false(0) +#' vld_false(c(FALSE, FALSE)) +#' @export +vld_false <- function(x) is.logical(x) && length(x) == 1L && !anyNA(x) && !x diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-file.R b/chk.Rcheck/00_pkg_src/chk/R/chk-file.R new file mode 100644 index 00000000..ae0994c8 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-file.R @@ -0,0 +1,42 @@ +#' Check File Exists +#' +#' @description +#' Checks if file exists using +#' +#' `vld_string(x) && file.exists(x) && !dir.exists(x)` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family file_checkers +#' +#' @seealso [vld_string()] +#' @seealso [file.exists()] +#' @seealso [dir.exists()] +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_file +#' try(chk_file(tempfile())) +#' @export +chk_file <- function(x, x_name = NULL) { + if (vld_file(x)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + chk_string(x, x_name = x_name) + if (dir.exists(x)) { + abort_chk(x_name, " must specify a file ('", x, "' is a directory)", x = x) + } + abort_chk(x_name, " must specify an existing file ('", x, "' can't be found)", x = x) +} + +#' @describeIn chk_file Validate File Exists +#' +#' @examples +#' # vld_file +#' vld_file(tempfile()) +#' @export +vld_file <- function(x) vld_string(x) && file.exists(x) && !dir.exists(x) diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-flag.R b/chk.Rcheck/00_pkg_src/chk/R/chk-flag.R new file mode 100644 index 00000000..96e4aac9 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-flag.R @@ -0,0 +1,47 @@ +#' Check Flag +#' +#' @description +#' Checks if non-missing logical scalar using +#' +#' `is.logical(x) && length(x) == 1L && !anyNA(x)` +#' +#' **Pass**: `TRUE`, `FALSE`. +#' +#' **Fail**: `logical(0)`, `c(TRUE, TRUE)`, `"TRUE"`, `1`, `NA`. +#' +#' Do not confuse this function with [chk_lgl()], +#' which also checks for logical scalars of `length(x) == 1` +#' but can include `NA`s. +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family logical_checkers +#' @family scalar_checkers +#' +#' @seealso [is.logical()] [length()] +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_flag +#' chk_flag(TRUE) +#' try(vld_flag(1)) +#' @export +chk_flag <- function(x, x_name = NULL) { + if (vld_flag(x)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + abort_chk(x_name, " must be a flag (TRUE or FALSE)", x = x) +} + +#' @describeIn chk_flag Validate Flag +#' +#' @examples +#' # vld_flag +#' vld_flag(TRUE) +#' vld_flag(1) +#' @export +vld_flag <- function(x) is.logical(x) && length(x) == 1L && !anyNA(x) diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-function.R b/chk.Rcheck/00_pkg_src/chk/R/chk-function.R new file mode 100644 index 00000000..6ee4b06e --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-function.R @@ -0,0 +1,45 @@ +#' Check Function +#' +#' @description +#' Checks if is a function using +#' +#' `is.function(x) && (is.null(formals) || length(formals(x)) == formals)` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family function_checkers +#' @family ellpisis_checkers +#' @family missing_checkers +#' +#' @seealso [is.function()] [formals()] +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_function +#' chk_function(mean) +#' try(chk_function(1)) +#' @export +chk_function <- function(x, formals = NULL, x_name = NULL) { + if (vld_function(x, formals)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + if (!is.function(x)) abort_chk(x_name, " must be a function", x = x, formals = formals) + abort_chk(x_name, " must have ", formals, " formal arguments (not ", length(formals(x)), ")", x = x, formals = formals) +} + +#' @describeIn chk_function Validate Function +#' +#' @examples +#' # vld_function +#' vld_function(mean) +#' vld_function(function(x) x) +#' vld_function(1) +#' vld_function(list(1)) +#' @export +vld_function <- function(x, formals = NULL) { + is.function(x) && (is.null(formals) || length(formals(x)) == formals) +} diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-gt.R b/chk.Rcheck/00_pkg_src/chk/R/chk-gt.R new file mode 100644 index 00000000..f1282f4a --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-gt.R @@ -0,0 +1,46 @@ +#' Check Greater Than +#' +#' @description +#' Checks if all non-missing values are greater than value using +#' +#' `all(x[!is.na(x)] > value)` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family range_checkers +#' +#' @seealso [all()] +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_gt +#' chk_gt(0.1) +#' try(chk_gt(c(0.1, -0.2))) +#' @export +chk_gt <- function(x, value = 0, x_name = NULL) { + if (vld_gt(x, value)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + if (length(x) == 1L) { + abort_chk(x_name, " must be greater than ", cc(value), ", not ", cc(x), x = x, value = value) + } + abort_chk(x_name, " must have values greater than ", cc(value), x = x, value = value) +} + +#' @describeIn chk_gt Validate Greater Than +#' +#' @examples +#' # vld_gt +#' vld_gt(numeric(0)) +#' vld_gt(0) +#' vld_gt(0.1) +#' vld_gt(c(0.1, 0.2, NA)) +#' vld_gt(c(0.1, -0.2)) +#' vld_gt(c(-0.1, 0.2), value = -1) +#' vld_gt("b", value = "a") +#' @export +vld_gt <- function(x, value = 0) all(x[!is.na(x)] > value) diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-gte.R b/chk.Rcheck/00_pkg_src/chk/R/chk-gte.R new file mode 100644 index 00000000..65a539e8 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-gte.R @@ -0,0 +1,48 @@ +#' Check Greater Than or Equal To +#' +#' @description +#' Checks if all non-missing values are greater than or equal to y using +#' +#' `all(x[!is.na(x)] >= value)` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family range_checkers +#' +#' @seealso [all()] +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_gte +#' chk_gte(0) +#' try(chk_gte(-0.1)) +#' @export +chk_gte <- function(x, value = 0, x_name = NULL) { + if (vld_gte(x, value)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + if (length(x) == 1L) { + abort_chk( + x_name, " must be greater than or equal to ", cc(value), + ", not ", cc(x), + x = x, value = value + ) + } + abort_chk(x_name, " must have values greater than or equal to ", cc(value), x = x, value = value) +} + +#' @describeIn chk_gte Validate Greater Than or Equal To +#' +#' @examples +#' # vld_gte +#' vld_gte(numeric(0)) +#' vld_gte(0) +#' vld_gte(-0.1) +#' vld_gte(c(0.1, 0.2, NA)) +#' vld_gte(c(0.1, 0.2, NA), value = 1) +#' @export +vld_gte <- function(x, value = 0) all(x[!is.na(x)] >= value) diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-identical.R b/chk.Rcheck/00_pkg_src/chk/R/chk-identical.R new file mode 100644 index 00000000..e0e7af66 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-identical.R @@ -0,0 +1,43 @@ +#' Check Identical +#' +#' @description +#' Checks if is identical to y using +#' +#' `identical(x, y)` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family equal_checkers +#' +#' @seealso [identical()] +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_identical +#' chk_identical(1, 1) +#' try(chk_identical(1, 1L)) +#' chk_identical(c(1, 1), c(1, 1)) +#' try(chk_identical(1, c(1, 1))) +#' @export +chk_identical <- function(x, y, x_name = NULL) { + if (identical(x, y)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + y_name <- as_label(y) + obj_of <- if (grepl("^<", y_name)) "the y object of class " else NULL + abort_chk(x_name, " must be identical to ", + obj_of, y_name, + x = x, y = y + ) +} + +#' @describeIn chk_identical Validate Identical +#' +#' @examples +#' vld_identical(1, 1) +#' @export +vld_identical <- function(x, y) identical(x, y) diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-integer.R b/chk.Rcheck/00_pkg_src/chk/R/chk-integer.R new file mode 100644 index 00000000..2fca7b14 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-integer.R @@ -0,0 +1,42 @@ +#' Check Integer +#' +#' @description +#' Checks if integer using +#' +#' `is.integer(x)` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family data_type_checkers +#' +#' @seealso [is.integer()] +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_integer +#' chk_integer(1L) +#' try(chk_integer(1)) +#' @export +chk_integer <- function(x, x_name = NULL) { + if (vld_integer(x)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk((substitute(x))) + abort_chk(x_name, " must be integer", x = x) +} + +#' @describeIn chk_integer Validate Integer +#' +#' @examples +#' # vld_integer +#' vld_integer(1L) +#' vld_integer(matrix(1:4, nrow = 2L)) +#' vld_integer(integer(0)) +#' vld_integer(NA_integer_) +#' vld_integer(1) +#' vld_integer(TRUE) +#' @export +vld_integer <- function(x) is.integer(x) diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-is.R b/chk.Rcheck/00_pkg_src/chk/R/chk-is.R new file mode 100644 index 00000000..af5b9d11 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-is.R @@ -0,0 +1,41 @@ +#' Check Class +#' +#' @description +#' Checks inherits from class using +#' +#' `inherits(x, class)` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family id_checkers +#' +#' @seealso [inherits()] +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' chk_is(1, "numeric") +#' try(chk_is(1L, "double")) +#' @export +chk_is <- function(x, class, x_name = NULL) { + if (vld_is(x, class)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + .class <- cc(class, conj = " or ", chk = FALSE) + abort_chk(x_name, " must inherit from class ", .class, x = x, .class = .class) +} + +#' @describeIn chk_is Validate Inherits from Class +#' +#' @examples +#' +#' # vld_is +#' vld_is(numeric(0), "numeric") +#' vld_is(1L, "double") +#' @export +vld_is <- function(x, class) { + inherits(x, class) +} diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-join.R b/chk.Rcheck/00_pkg_src/chk/R/chk-join.R new file mode 100644 index 00000000..e1f25a55 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-join.R @@ -0,0 +1,53 @@ +#' Check Join +#' +#' @description +#' Checks if all rows in x match at least one in y. +#' +#' @inheritParams params +#' @param y A data.frame with columns in by. +#' @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_join +#' chk_join(data.frame(z = 1), data.frame(z = 1:2), by = "z") +#' try(chk_join(data.frame(z = 1), data.frame(z = 2), by = "z")) +#' @export +chk_join <- function(x, y, by, x_name = NULL) { + if (vld_join(x, y, by)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + y_name <- as_label(y) + obj_of <- if (grepl("^<", y_name)) "the y object of class " else NULL + abort_chk("All rows in ", x_name, " must match at least one in ", + obj_of, y_name, + x = x, y = y, by = by + ) +} + +#' @describeIn chk_join Validate Join +#' +#' @examples +#' # vld_join +#' vld_join(data.frame(z = 1), data.frame(z = 1:2), by = "z") +#' vld_join(data.frame(z = 1), data.frame(z = 2), by = "z") +#' vld_join(data.frame(z = 1), data.frame(a = 1:2), by = c(z = "a")) +#' vld_join(data.frame(z = 1), data.frame(a = 2), by = c(z = "a")) +#' @export +vld_join <- function(x, y, by) { + if (is.null(by)) { + return(FALSE) + } + identical( + nrow(x), + nrow(merge(as.data.frame(x), unique(as.data.frame(y)[by]), + by.x = if (is.null(names(by))) by else names(by), by.y = by + )) + ) +} diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-length.R b/chk.Rcheck/00_pkg_src/chk/R/chk-length.R new file mode 100644 index 00000000..b774fa9c --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-length.R @@ -0,0 +1,42 @@ +#' Check Length +#' +#' @description +#' Checks length is a particular value or range using +#' +#' `length(x) >= length && length(x) <= upper` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family length_checkers +#' +#' @seealso [length()], [check_length()], [check_dim()] +#' +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_length +#' chk_length("text") +#' try(vld_length("text", length = 2)) +#' @export +chk_length <- function(x, length = 1L, upper = length, x_name = NULL) { + if (vld_length(x, length, upper)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + if (length == upper) { + abort_chk(x_name, " must be length ", length, " not ", length(x), x = x, length = length) + } + abort_chk(x_name, " must have a length between ", length, " and ", upper, " not ", length(x), x = x, length = length) +} + +#' @describeIn chk_length Validate Length +#' +#' @examples +#' # vld_length +#' vld_length(2:1, 2) +#' vld_length(2:1, 1) +#' @export +vld_length <- function(x, length = 1L, upper = length) length(x) >= length && length(x) <= upper diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-lgl.R b/chk.Rcheck/00_pkg_src/chk/R/chk-lgl.R new file mode 100644 index 00000000..a8688dba --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-lgl.R @@ -0,0 +1,54 @@ +#' Check Logical Scalar +#' +#' @description +#' Checks if logical scalar using +#' +#' `is.logical(x) && length(x) == 1L` +#' +#' If you only want to check the data type (not whether `length(x) == 1`), +#' you should use the [chk_logical()] function. +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family logical_checkers +#' @family scalar_checkers +#' +#' @seealso [is.logical()] +#' @seealso [length()] +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_lgl +#' chk_lgl(NA) +#' try(chk_lgl(1)) +#' @export +chk_lgl <- function(x, x_name = NULL) { + if (vld_lgl(x)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk((substitute(x))) + abort_chk(x_name, " must be a logical scalar (TRUE, FALSE or NA)", x = x) +} + +#' @describeIn chk_lgl Validate Logical Scalar +#' +#' @examples +#' # vld_lgl +#' vld_lgl(TRUE) +#' vld_lgl(FALSE) +#' vld_lgl(NA) +#' vld_lgl(1) +#' vld_lgl(c(TRUE, TRUE)) +#' @export +vld_lgl <- function(x) { + deprecate_soft( + "0.9.3", + what = "chk::chk_lgl()", + details = "Please use `chk::chk_scalar(x);` `chk::chk_logical(x)` instead", + id = "chk_lgl" + ) + is.logical(x) && length(x) == 1L +} diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-list.R b/chk.Rcheck/00_pkg_src/chk/R/chk-list.R new file mode 100644 index 00000000..fec55b55 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-list.R @@ -0,0 +1,41 @@ +#' Check List +#' +#' @description +#' Checks if is a list using +#' +#' `is.list(x)` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family data_structure_checkers +#' +#' @seealso [is.list()] +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_list +#' chk_list(list()) +#' try(chk_list(1)) +#' @export +chk_list <- function(x, x_name = NULL) { + if (vld_list(x)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + abort_chk(x_name, " must be a list", x = x) +} + +#' @describeIn chk_list Validate List +#' +#' @examples +#' # vld_list +#' vld_list(list()) +#' vld_list(list(x = 1)) +#' vld_list(mtcars) +#' vld_list(1) +#' vld_list(NULL) +#' @export +vld_list <- function(x) is.list(x) diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-logical.R b/chk.Rcheck/00_pkg_src/chk/R/chk-logical.R new file mode 100644 index 00000000..5a8e9733 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-logical.R @@ -0,0 +1,47 @@ +#' Check Logical +#' +#' @description +#' Checks if logical using +#' +#' `is.logical(x)` +#' +#' If you want to check if it is a scalar, +#' meaning that in addition to being of logical type, +#' it has `length(x) == 1`, you should use [chk_lgl()] +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family logical_checkers +#' @family data_type_checkers +#' +#' @seealso [is.logical()] +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_logical +#' chk_logical(TRUE) +#' try(chk_logical(1)) +#' @export +chk_logical <- function(x, x_name = NULL) { + if (vld_logical(x)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk((substitute(x))) + abort_chk(x_name, " must be logical", x = x) +} + +#' @describeIn chk_logical Validate Logical +#' +#' @examples +#' # vld_logical +#' vld_logical(TRUE) +#' vld_logical(matrix(TRUE)) +#' vld_logical(logical(0)) +#' vld_logical(NA) +#' vld_logical(1) +#' vld_logical("TRUE") +#' @export +vld_logical <- function(x) is.logical(x) diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-lt.R b/chk.Rcheck/00_pkg_src/chk/R/chk-lt.R new file mode 100644 index 00000000..47e8d6ba --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-lt.R @@ -0,0 +1,47 @@ +#' Check Less Than +#' +#' @description +#' Checks if all non-missing values are less than value using +#' +#' `all(x[!is.na(x)] < value)` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family range_checkers +#' +#' @seealso [all()] +#' +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_lt +#' chk_lt(-0.1) +#' try(chk_lt(c(-0.1, 0.2))) +#' @export +chk_lt <- function(x, value = 0, x_name = NULL) { + if (vld_lt(x, value)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + if (length(x) == 1L) { + abort_chk(x_name, " must be less than ", cc(value), ", not ", cc(x), x = x, value = value) + } + abort_chk(x_name, " must have values less than ", cc(value), x = x, value = value) +} + +#' @describeIn chk_lt Validate Less Than +#' +#' @examples +#' # vld_lt +#' vld_lt(numeric(0)) +#' vld_lt(0) +#' vld_lt(-0.1) +#' vld_lt(c(-0.1, -0.2, NA)) +#' vld_lt(c(-0.1, 0.2)) +#' vld_lt(c(-0.1, 0.2), value = 1) +#' vld_lt("a", value = "b") +#' @export +vld_lt <- function(x, value = 0) all(x[!is.na(x)] < value) diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-lte.R b/chk.Rcheck/00_pkg_src/chk/R/chk-lte.R new file mode 100644 index 00000000..c766635e --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-lte.R @@ -0,0 +1,47 @@ +#' Check Less Than or Equal To +#' +#' @description +#' Checks if all non-missing values are less than or equal to y using +#' +#' `all(x[!is.na(x)] <= value)` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family range_checkers +#' +#' @seealso [all()] +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_lte +#' chk_lte(0) +#' try(chk_lte(0.1)) +#' @export +chk_lte <- function(x, value = 0, x_name = NULL) { + if (vld_lte(x, value)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + if (length(x) == 1L) { + abort_chk( + x_name, " must be less than or equal to ", cc(value), ", not ", cc(x), + "" + ) + } + abort_chk(x_name, " must have values less than or equal to ", cc(value), x = x, value = value) +} + +#' @describeIn chk_lte Validate Less Than or Equal To +#' +#' @examples +#' # vld_lte +#' vld_lte(numeric(0)) +#' vld_lte(0) +#' vld_lte(0.1) +#' vld_lte(c(-0.1, -0.2, NA)) +#' vld_lte(c(-0.1, -0.2, NA), value = -1) +#' @export +vld_lte <- function(x, value = 0) all(x[!is.na(x)] <= value) diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-match.R b/chk.Rcheck/00_pkg_src/chk/R/chk-match.R new file mode 100644 index 00000000..7da5b901 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-match.R @@ -0,0 +1,46 @@ +#' Check Matches +#' +#' @description +#' Checks if all values match regular expression using +#' +#' `all(grepl(regexp, x[!is.na(x)]))` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family regex_checkers +#' +#' @seealso [all()] +#' @seealso [grepl()] +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_match +#' chk_match("1") +#' try(chk_match("1", regexp = "2")) +#' @export +chk_match <- function(x, regexp = ".+", x_name = NULL) { + if (vld_match(x, regexp)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + + if (length(x) == 1L) { + abort_chk(x_name, " must match regular expression '", regexp, "'", x = x, regexp = regexp) + } + abort_chk(x_name, " must have values matching regular expression '", regexp, "'", x = x, regexp = regexp) +} + +#' @describeIn chk_match Validate Matches +#' +#' @examples +#' # vld_match +#' vld_match("1") +#' vld_match("a", regexp = "a") +#' vld_match("") +#' vld_match("1", regexp = "2") +#' vld_match(NA_character_, regexp = ".*") +#' @export +vld_match <- function(x, regexp = ".+") all(grepl(regexp, x[!is.na(x)])) diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-matrix.R b/chk.Rcheck/00_pkg_src/chk/R/chk-matrix.R new file mode 100644 index 00000000..811624ed --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-matrix.R @@ -0,0 +1,38 @@ +#' Check Matrix +#' +#' @description +#' Checks if is a matrix using +#' +#' `is.matrix(x)` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family data_structure_checkers +#' +#' @seealso [is.matrix()] +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_matrix +#' chk_matrix(matrix(1)) +#' try(chk_matrix(array(1))) +#' @export +chk_matrix <- function(x, x_name = NULL) { + if (vld_matrix(x)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + abort_chk(x_name, " must be an matrix", x = x) +} + +#' @describeIn chk_matrix Validate Matrix +#' +#' @examples +#' # vld_matrix +#' vld_matrix(1) +#' vld_matrix(matrix(1)) +#' @export +vld_matrix <- function(x) is.matrix(x) diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-missing.R b/chk.Rcheck/00_pkg_src/chk/R/chk-missing.R new file mode 100644 index 00000000..47834146 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-missing.R @@ -0,0 +1,50 @@ +#' Check Missing Argument +#' +#' @description +#' Checks argument missing using +#' +#' `missing(x)` +#' +#' @details +#' Currently only checks if value is available +#' (as opposed to whether it was specified). +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family missing_checkers +#' +#' @seealso [missing()] +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_missing +#' fun <- function(x) { +#' chk_missing(x) +#' } +#' fun() +#' try(fun(1)) +#' @export +chk_missing <- function(x, x_name = NULL) { + if (vld_missing(x)) { + return(invisible(NULL)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + abort_chk(x_name, " must be missing") +} + +#' @describeIn chk_missing Validate Missing Argument +#' +#' @examples +#' # vld_missing +#' fun <- function(x) { +#' vld_missing(x) +#' } +#' fun() +#' fun(1) +#' @export +vld_missing <- function(x) { + missing(x) +} diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-named.R b/chk.Rcheck/00_pkg_src/chk/R/chk-named.R new file mode 100644 index 00000000..bcc0245a --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-named.R @@ -0,0 +1,43 @@ +#' Check Named +#' +#' @description +#' Checks if is named using +#' +#' `!is.null(names(x))` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family name_checkers +#' +#' @seealso [names()] +#' @seealso [is.null()] +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_named +#' chk_named(c(x = 1)) +#' try(chk_named(list(1))) +#' @export +chk_named <- function(x, x_name = NULL) { + if (vld_named(x)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk((substitute(x))) + abort_chk(x_name, " must be named", x = x) +} + +#' @describeIn chk_named Validate Named +#' +#' @examples +#' # vld_named +#' vld_named(c(x = 1)) +#' vld_named(list(x = 1)) +#' vld_named(c(x = 1)[-1]) +#' vld_named(list(x = 1)[-1]) +#' vld_named(1) +#' vld_named(list(1)) +#' @export +vld_named <- function(x) !is.null(names(x)) diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-not-any-na.R b/chk.Rcheck/00_pkg_src/chk/R/chk-not-any-na.R new file mode 100644 index 00000000..41fceb02 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-not-any-na.R @@ -0,0 +1,45 @@ +#' Check Not Any Missing Values +#' +#' @description +#' Checks if not any missing values using +#' +#' `!anyNA(x)` +#' +#' **Pass**: `1`, `1:2`, `"1"`, `logical(0)`. +#' +#' **Fail**: `NA`, `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_not_any_na +#' chk_not_any_na(1) +#' try(chk_not_any_na(NA)) +#' @export +chk_not_any_na <- function(x, x_name = NULL) { + if (vld_not_any_na(x)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk((substitute(x))) + abort_chk(x_name, " must not have any missing values", x = x) +} + +#' @describeIn chk_not_any_na Validate Not Any Missing Values +#' +#' @examples +#' # vld_not_any_na +#' vld_not_any_na(1) +#' vld_not_any_na(1:2) +#' vld_not_any_na(NA_real_) +#' vld_not_any_na(integer(0)) +#' vld_not_any_na(c(NA, 1)) +#' vld_not_any_na(TRUE) +#' @export +vld_not_any_na <- function(x) !anyNA(x) diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-not-empty.R b/chk.Rcheck/00_pkg_src/chk/R/chk-not-empty.R new file mode 100644 index 00000000..b46eb271 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-not-empty.R @@ -0,0 +1,46 @@ +#' Check Not Empty +#' +#' @description +#' Checks if not empty using +#' +#' `length(x) != 0L` +#' +#' **Pass**: `1`, `1:2`, `NA`, `matrix(1:3)`, `list(1)`, `data.frame(x = 1)`. +#' +#' **Fail**: `NULL`, `logical(0)`, `list()`, `data.frame()`. +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family misc_checkers +#' +#' @seealso [length()] +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_not_empty +#' chk_not_empty(1) +#' try(chk_not_empty(numeric(0))) +#' @export +chk_not_empty <- function(x, x_name = NULL) { + if (vld_not_empty(x)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk((substitute(x))) + abort_chk(x_name, " must not be empty (zero length)", x = x) +} + +#' @describeIn chk_not_empty Validate Not Empty +#' +#' @examples +#' # vld_not_empty +#' vld_not_empty(1) +#' vld_not_empty(matrix(1:3)) +#' vld_not_empty(character(0)) +#' vld_not_empty(list(1)) +#' vld_not_empty(NULL) +#' vld_not_empty(list()) +#' @export +vld_not_empty <- function(x) length(x) != 0L diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-not-missing.R b/chk.Rcheck/00_pkg_src/chk/R/chk-not-missing.R new file mode 100644 index 00000000..e83f3941 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-not-missing.R @@ -0,0 +1,50 @@ +#' Check Not Missing Argument +#' +#' @description +#' Checks argument not missing using +#' +#' `!missing(x)` +#' +#' @details +#' Currently only checks if value is available +#' (as opposed to whether it was specified). +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family missing_checkers +#' +#' @seealso [missing()] +#' +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_not_missing +#' fun <- function(x) { +#' chk_not_missing(x) +#' } +#' fun(1) +#' try(fun()) +#' @export +chk_not_missing <- function(x, x_name = "`x`") { + if (vld_not_missing(x)) { + return(invisible(x)) + } + abort_chk(x_name, " must not be missing.", tidy = FALSE) +} + +#' @describeIn chk_not_missing Validate Not Missing Argument +#' +#' @examples +#' # vld_not_missing +#' fun <- function(x) { +#' vld_not_missing(x) +#' } +#' fun() +#' fun(1) +#' @export +vld_not_missing <- function(x) { + !missing(x) +} diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-not-null.R b/chk.Rcheck/00_pkg_src/chk/R/chk-not-null.R new file mode 100644 index 00000000..a2de3763 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-not-null.R @@ -0,0 +1,39 @@ +#' Check not NULL +#' +#' @description +#' Checks if not NULL using +#' +#' `!is.null(x)` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family null_checkers +#' +#' @seealso [is.null()] +#' +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_not_null +#' try(chk_not_null(NULL)) +#' chk_not_null(1) +#' @export +chk_not_null <- function(x, x_name = NULL) { + if (vld_not_null(x)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + abort_chk(x_name, " must not be NULL", x = x) +} + +#' @describeIn chk_not_null Validate Not NULL +#' +#' @examples +#' # vld_not_null +#' vld_not_null(1) +#' vld_not_null(NULL) +#' @export +vld_not_null <- function(x) !is.null(x) diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-not-subset.R b/chk.Rcheck/00_pkg_src/chk/R/chk-not-subset.R new file mode 100644 index 00000000..8d10057a --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-not-subset.R @@ -0,0 +1,45 @@ +#' Check Not Subset +#' +#' @description +#' Checks if not all values in values using +#' +#' `!any(x %in% values) || !length(x)` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family set_checkers +#' +#' @seealso [any()] +#' @seealso [length()] +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_not_subset +#' chk_not_subset(11, 1:10) +#' try(chk_not_subset(1, 1:10)) +#' @export +chk_not_subset <- function(x, values, x_name = NULL) { + if (vld_not_subset(x, values)) { + return(invisible(x)) + } + values <- sort(unique(values), na.last = TRUE) + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + + if (length(x) == 1L) { + abort_chk(x_name, " must not match ", cc(unique(c(x, values)), " or "), x = x, values = values) + } + abort_chk(x_name, " must not have any values matching ", cc(values, " or "), x = x, values = values) +} + +#' @describeIn chk_subset Validate Not Subset +#' +#' @examples +#' # vld_not_subset +#' vld_not_subset(numeric(0), 1:10) +#' vld_not_subset(1, 1:10) +#' vld_not_subset(11, 1:10) +#' @export +vld_not_subset <- function(x, values) !any(x %in% values) || !length(x) diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-null-or.R b/chk.Rcheck/00_pkg_src/chk/R/chk-null-or.R new file mode 100644 index 00000000..369ecd62 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-null-or.R @@ -0,0 +1,55 @@ +#' Check NULL Or +#' +#' @description +#' Checks if NULL or passes test. +#' +#' @inheritParams params +#' @param chk A chk function. Soft-deprecated for vld. `r lifecycle::badge("deprecated")` + +#' @param vld A vld function. +#' @param ... Arguments passed to chk. +#' +#' @return An informative error if the test fails. +#' @export +#' +#' @examples +#' chk_null_or(NULL, chk_number) +#' chk_null_or(1, chk_number) +#' try(chk_null_or("1", chk_number)) +chk_null_or <- function(x, chk, ..., vld, x_name = NULL) { + if (!missing(chk)) { + lifecycle::deprecate_soft("0.6.1", "chk_null_or(chk)", "chk_null_or(vld)") + } + if (is.null(x)) { + return(invisible(x)) + } + if (missing(vld)) { + try <- try_chk(chk(x, ...)) + if (is.null(try)) { + return(invisible(x)) + } + + if (is.null(x_name)) { + x_name <- deparse_backtick_chk(substitute(x)) + try <- try_chk(chk(x, ..., x_name = x_name)) + } + msg <- try_msg(try) + msg <- sub("[.]$", " or NULL.", msg) + abort_chk(msg, x = x) + } + if (vld(x, ...)) { + return(invisible(x)) + } + + if (is.null(x_name)) { + x_name <- deparse_backtick_chk(substitute(x)) + } + chk <- deparse(substitute(vld)) + chk <- sub("^(chk::){0,1}vld_", "chk_", chk) + chk <- paste0(chk, "(x, ..., x_name = x_name)") + chk <- parse(text = chk) + try <- try_chk(eval(chk)) + msg <- try_msg(try) + msg <- sub("[.]$", " or NULL.", msg) + abort_chk(msg, x = x) +} diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-null.R b/chk.Rcheck/00_pkg_src/chk/R/chk-null.R new file mode 100644 index 00000000..4e39b8c4 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-null.R @@ -0,0 +1,39 @@ +#' Check NULL +#' +#' @description +#' Checks if NULL using +#' +#' `is.null(x)` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family null_checkers +#' +#' @seealso [is.null()] +#' +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_null +#' try(chk_null(1)) +#' chk_null(NULL) +#' @export +chk_null <- function(x, x_name = NULL) { + if (vld_null(x)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + abort_chk(x_name, " must be NULL", x = x) +} + +#' @describeIn chk_null Validate NULL +#' +#' @examples +#' # vld_null +#' vld_null(NULL) +#' vld_null(1) +#' @export +vld_null <- function(x) is.null(x) diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-number.R b/chk.Rcheck/00_pkg_src/chk/R/chk-number.R new file mode 100644 index 00000000..343b5d09 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-number.R @@ -0,0 +1,44 @@ +#' Check Number +#' +#' @description +#' Checks if non-missing numeric scalar using +#' +#' `is.numeric(x) && length(x) == 1L && !anyNA(x)` +#' +#' **Pass**: `1`, `2L`, `log(10)`, `-Inf` +#' +#' **Fail**: `"a"`, `1:3`, `NA_real_` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family data_type_checkers scalar_checkers +#' +#' @seealso [is.numeric()] +#' @seealso [length()] +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_number +#' chk_number(1.1) +#' try(chk_number(TRUE)) +#' @export +chk_number <- function(x, x_name = NULL) { + if (vld_number(x)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + abort_chk(x_name, " must be a number (non-missing numeric scalar)", x = x) +} + +#' @describeIn chk_number Validate Number +#' +#' @examples +#' # vld_number +#' vld_number(1.1) +#' @export +vld_number <- function(x) { + is.numeric(x) && length(x) == 1L && !anyNA(x) +} diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-numeric.R b/chk.Rcheck/00_pkg_src/chk/R/chk-numeric.R new file mode 100644 index 00000000..47d7df09 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-numeric.R @@ -0,0 +1,46 @@ +#' Check Numeric +#' +#' @description +#' Checks if numeric using +#' +#' `is.numeric(x)` +#' +#' **Pass**: `1`, `1:2`, `NA_real_`, `integer(0)`, `matrix(1:3)`. +#' +#' **Fail**: `TRUE`, `"1"`, `NA`, `NULL`. +#' +#' @inheritParams chk_flag +#' @inherit params return +#' +#' @family data_type_checkers +#' +#' @seealso [is.numeric()] +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_numeric +#' chk_numeric(1) +#' try(chk_numeric("1")) +#' @export +chk_numeric <- function(x, x_name = NULL) { + if (vld_numeric(x)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk((substitute(x))) + abort_chk(x_name, " must be numeric", x = x) +} + +#' @describeIn chk_numeric Validate Numeric +#' +#' @examples +#' # vld_numeric +#' vld_numeric(1) +#' vld_numeric(1:2) +#' vld_numeric(NA_real_) +#' vld_numeric(integer(0)) +#' vld_numeric("1") +#' vld_numeric(TRUE) +#' @export +vld_numeric <- function(x) is.numeric(x) diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-orderset.R b/chk.Rcheck/00_pkg_src/chk/R/chk-orderset.R new file mode 100644 index 00000000..1ff03668 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-orderset.R @@ -0,0 +1,51 @@ +#' Check Set Ordered +#' +#' @description +#' Checks if the first occurrence of each shared element +#' in x is equivalent to the first occurrence of each shared element in values using +#' `vld_equivalent(unique(x[x %in% values]), values[values %in% x])`. +#' +#' @inheritParams params +#' @return +#' The `chk_` function throws an informative error if the test fails. +#' +#' The `vld_` function returns a flag indicating whether the test was met. +#' +#' @family set_checkers +#' +#' @seealso [vld_equivalent()] +#' @seealso [unique()] +#' +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' @export +#' +#' @examples +#' +#' # chk_orderset +#' chk_orderset(1:2, 1:2) +#' try(chk_orderset(2:1, 1:2)) +chk_orderset <- function(x, values, x_name = NULL) { + if (vld_orderset(x, values)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk((substitute(x))) + values <- values[values %in% x] + abort_chk(x_name, " must have (the first occurence of) each of the following elements in the following order: ", cc(values), x = x, values = values) +} + +#' @describeIn chk_setequal Validate Set Ordered +#' +#' @export +#' +#' @examples +#' +#' # vld_orderset +#' vld_orderset(1, 1) +#' vld_orderset(1:2, 2:1) +#' vld_orderset(1, 2:1) +#' vld_orderset(1:2, 2) +vld_orderset <- function(x, values) { + vld_equivalent(unique(x[x %in% values]), values[values %in% x]) +} diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-package.R b/chk.Rcheck/00_pkg_src/chk/R/chk-package.R new file mode 100644 index 00000000..73b0754f --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-package.R @@ -0,0 +1,8 @@ +#' @keywords internal +"_PACKAGE" + +## usethis namespace: start +#' @import rlang lifecycle +#' @importFrom lifecycle deprecated +## usethis namespace: end +NULL diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-range.R b/chk.Rcheck/00_pkg_src/chk/R/chk-range.R new file mode 100644 index 00000000..aee0459f --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-range.R @@ -0,0 +1,71 @@ +#' Checks range of non-missing values +#' +#' @description +#' Checks all non-missing values fall within range using +#' +#' If inclusive +#' +#' `all(x[!is.na(x)] >= range[1] & x[!is.na(x)] <= range[2])` +#' +#' else +#' +#' `all(x[!is.na(x)] > range[1] & x[!is.na(x)] < range[2])` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family range_checkers +#' +#' @seealso [all()] +#' +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_range +#' chk_range(0) +#' try(chk_range(-0.1)) +#' @export +chk_range <- function(x, range = c(0, 1), inclusive = TRUE, x_name = NULL) { + if (vld_range(x, range, inclusive)) { + return(invisible(x)) + } + + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + + if (length(x) == 1L) { + if (inclusive && range[1] == range[2]) { + abort_chk(x_name, " must be ", cc(range[1]), ", not ", cc(x), x = x, range = range) + } + abort_chk( + x_name, " must be between ", cc(range, " and "), + ifelse(isTRUE(inclusive), "", " exclusive"), + ", not ", cc(x) + ) + } + if (inclusive && range[1] == range[2]) { + abort_chk(x_name, " must have values of ", cc(range[1]), x = x, range = range) + } + abort_chk(x_name, " must have values between ", cc(range, " and "), + ifelse(isTRUE(inclusive), "", " exclusive"), + x = x, range = range + ) +} + +#' @describeIn chk_range Validate Range +#' +#' @examples +#' # vld_range +#' vld_range(numeric(0)) +#' vld_range(0) +#' vld_range(-0.1) +#' vld_range(c(0.1, 0.2, NA)) +#' vld_range(c(0.1, 0.2, NA), range = c(0, 1)) +#' @export +vld_range <- function(x, range = c(0, 1), inclusive = TRUE) { + if (isTRUE(inclusive)) { + return(all(x[!is.na(x)] >= range[1] & x[!is.na(x)] <= range[2])) + } + all(x[!is.na(x)] > range[1] & x[!is.na(x)] < range[2]) +} diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-raw.R b/chk.Rcheck/00_pkg_src/chk/R/chk-raw.R new file mode 100644 index 00000000..5364e84e --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-raw.R @@ -0,0 +1,40 @@ +#' Check Raw +#' +#' @description +#' Checks if raw using +#' +#' `is.raw(x)` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family data_type_checkers +#' +#' @seealso [is.raw()] +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_raw +#' chk_raw(as.raw(1)) +#' try(chk_raw(1)) +#' @export +chk_raw <- function(x, x_name = NULL) { + if (vld_raw(x)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk((substitute(x))) + abort_chk(x_name, " must be raw", x = x) +} + +#' @describeIn chk_raw Validate Raw +#' +#' @examples +#' # vld_raw +#' vld_raw(as.raw(1)) +#' vld_raw(raw(0)) +#' vld_raw(1) +#' vld_raw(TRUE) +#' @export +vld_raw <- function(x) is.raw(x) diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-s3-class.R b/chk.Rcheck/00_pkg_src/chk/R/chk-s3-class.R new file mode 100644 index 00000000..8975b5ae --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-s3-class.R @@ -0,0 +1,39 @@ +#' Check Type +#' +#' @description +#' Checks inherits from S3 class using +#' +#' `!isS4(x) && inherits(x, class)` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family id_checkers +#' +#' @seealso [inherits()] +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_s3_class +#' chk_s3_class(1, "numeric") +#' try(chk_s3_class(getClass("MethodDefinition"), "classRepresentation")) +#' @export +chk_s3_class <- function(x, class, x_name = NULL) { + if (vld_s3_class(x, class)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + .class <- cc(class, conj = " or ", chk = FALSE) + abort_chk(x_name, " must inherit from S3 class ", .class, x = x, .class = .class) +} + +#' @describeIn chk_s3_class Validate Inherits from S3 Class +#' +#' @examples +#' # vld_s3_class +#' vld_s3_class(numeric(0), "numeric") +#' vld_s3_class(getClass("MethodDefinition"), "classRepresentation") +#' @export +vld_s3_class <- function(x, class) !isS4(x) && inherits(x, class) diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-s4-class.R b/chk.Rcheck/00_pkg_src/chk/R/chk-s4-class.R new file mode 100644 index 00000000..e5bf8998 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-s4-class.R @@ -0,0 +1,39 @@ +#' Check Inherits from S4 Class +#' +#' @description +#' Checks inherits from S4 class using +#' +#' `isS4(x) && methods::is(x, class)` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family id_checkers +#' +#' @seealso [methods::is()] +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_s4_class +#' try(chk_s4_class(1, "numeric")) +#' chk_s4_class(getClass("MethodDefinition"), "classRepresentation") +#' @export +chk_s4_class <- function(x, class, x_name = NULL) { + if (vld_s4_class(x, class)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + .class <- cc(class, conj = " or ", chk = FALSE) + abort_chk(x_name, " must inherit from S4 class ", .class, x = x, .class = .class) +} + +#' @describeIn chk_s4_class Validate Inherits from S4 Class +#' +#' @examples +#' # vld_s4_class +#' vld_s4_class(numeric(0), "numeric") +#' vld_s4_class(getClass("MethodDefinition"), "classRepresentation") +#' @export +vld_s4_class <- function(x, class) isS4(x) && methods::is(x, class) diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-scalar.R b/chk.Rcheck/00_pkg_src/chk/R/chk-scalar.R new file mode 100644 index 00000000..f20e4c78 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-scalar.R @@ -0,0 +1,38 @@ +#' Check Scalar +#' +#' @description +#' Checks if is a vector using +#' +#' `length(x) == 1L` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family scalar_checkers +#' +#' @seealso [length()] +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_scalar +#' chk_scalar(1) +#' chk_scalar(list(1)) +#' try(chk_scalar(1:2)) +#' @export +chk_scalar <- function(x, x_name = NULL) { + if (vld_scalar(x)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + abort_chk(x_name, " must be a scalar (length 1)", x = x) +} + +#' @describeIn chk_scalar Validate Scalar +#' +#' @examples +#' # vld_scalar +#' vld_scalar(1) +#' @export +vld_scalar <- function(x) length(x) == 1L diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-setequal.R b/chk.Rcheck/00_pkg_src/chk/R/chk-setequal.R new file mode 100644 index 00000000..386f1df2 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-setequal.R @@ -0,0 +1,41 @@ +#' Check Set Equal +#' +#' @description +#' Checks if equal set using +#' +#' `setequal(x, values)` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family set_checkers +#' +#' @seealso [setequal()] +#' +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_setequal +#' chk_setequal(1:2, 2:1) +#' try(chk_setequal(1, 1:2)) +#' @export +chk_setequal <- function(x, values, x_name = NULL) { + if (vld_setequal(x, values)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk((substitute(x))) + abort_chk(x_name, " must equal set: ", cc(values), x = x, values = values) +} + +#' @describeIn chk_setequal Validate Set Equal +#' +#' @examples +#' # vld_setequal +#' vld_setequal(1, 1) +#' vld_setequal(1:2, 2:1) +#' vld_setequal(1, 2:1) +#' vld_setequal(1:2, 2) +#' @export +vld_setequal <- function(x, values) setequal(x, values) diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-sorted.R b/chk.Rcheck/00_pkg_src/chk/R/chk-sorted.R new file mode 100644 index 00000000..41882fc0 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-sorted.R @@ -0,0 +1,38 @@ +#' Check Sorted +#' +#' @description +#' Checks if is sorted using +#' +#' `is.unsorted(x, na.rm = TRUE)` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family sorted_checkers +#' +#' @seealso [is.unsorted()] +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_sorted +#' chk_sorted(1:2) +#' try(chk_sorted(2:1)) +#' @export +chk_sorted <- function(x, x_name = NULL) { + if (vld_sorted(x)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + abort_chk(x_name, " must be sorted", x = x) +} + +#' @describeIn chk_sorted Validate Sorted +#' +#' @examples +#' # vld_sorted +#' vld_sorted(1:2) +#' vld_sorted(2:1) +#' @export +vld_sorted <- function(x) !is.unsorted(x, na.rm = TRUE) diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-string.R b/chk.Rcheck/00_pkg_src/chk/R/chk-string.R new file mode 100644 index 00000000..4eb54ced --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-string.R @@ -0,0 +1,43 @@ +#' Check String +#' +#' @description +#' Checks if string +#' +#' `is.character(x) && length(x) == 1L && !anyNA(x)` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family scalar_checkers +#' +#' @seealso [length()] +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_string +#' chk_string("1") +#' try(chk_string(1)) +#' @export +chk_string <- function(x, x_name = NULL) { + if (vld_string(x)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + abort_chk(x_name, " must be a string (non-missing character scalar)", x = x) +} + +#' @describeIn chk_string Validate String +#' +#' @examples +#' # vld_string +#' vld_string("1") +#' vld_string("") +#' vld_string(1) +#' vld_string(NA_character_) +#' vld_string(c("1", "1")) +#' @export +vld_string <- function(x) { + is.character(x) && length(x) == 1L && !anyNA(x) +} diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-subset.R b/chk.Rcheck/00_pkg_src/chk/R/chk-subset.R new file mode 100644 index 00000000..6c4132e1 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-subset.R @@ -0,0 +1,47 @@ +#' Check Subset +#' +#' @description +#' Checks if all values in values using +#' +#' `all(x %in% values)` +#' +#' Pay attention to the order of the arguments `value` and `x` +#' in this function compared to [chk_superset()] +#' +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family set_checkers +#' +#' @seealso [all()] +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_subset +#' chk_subset(1, 1:10) +#' try(chk_subset(11, 1:10)) +#' @export +chk_subset <- function(x, values, x_name = NULL) { + if (vld_subset(x, values)) { + return(invisible(x)) + } + values <- sort(unique(values), na.last = TRUE) + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + if (length(x) == 1L) { + abort_chk(x_name, " must match ", cc(values, " or "), ", not ", cc(x), x = x, values = values) + } + abort_chk(x_name, " must have values matching ", cc(values, " or "), x = x, values = values) +} + +#' @describeIn chk_subset Validate Subset +#' +#' @examples +#' # vld_subset +#' vld_subset(numeric(0), 1:10) +#' vld_subset(1, 1:10) +#' vld_subset(11, 1:10) +#' @export +vld_subset <- function(x, values) all(x %in% values) diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-superset.R b/chk.Rcheck/00_pkg_src/chk/R/chk-superset.R new file mode 100644 index 00000000..30d3aa68 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-superset.R @@ -0,0 +1,45 @@ +#' Check Superset +#' +#' @description +#' Checks if includes all values using +#' +#' `all(values %in% x)` +#' +#' Pay attention to the order of the arguments `value` and `x` +#' in this function compared to [chk_subset()] +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family set_checkers +#' +#' @seealso [all()] +#' +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_superset +#' chk_superset(1:3, 1) +#' try(chk_superset(1:3, 4)) +#' @export +chk_superset <- function(x, values, x_name = NULL) { + if (vld_superset(x, values)) { + return(invisible(x)) + } + values <- sort(unique(values), na.last = TRUE) + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + values <- values[!values %in% x] + abort_chk(x_name, " must include ", cc(values, " and "), x = x, values = values) +} + +#' @describeIn chk_superset Validates Superset +#' +#' @examples +#' # vld_superset +#' vld_superset(1:3, 1) +#' vld_superset(1:3, 4) +#' vld_superset(integer(0), integer(0)) +#' @export +vld_superset <- function(x, values) all(values %in% x) diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-true.R b/chk.Rcheck/00_pkg_src/chk/R/chk-true.R new file mode 100644 index 00000000..8437cf74 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-true.R @@ -0,0 +1,43 @@ +#' Check TRUE +#' +#' @description +#' Checks if TRUE using +#' +#' `is.logical(x) && length(x) == 1L && !anyNA(x) && x` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family logical_checkers +#' @family scalar_checkers +#' +#' @seealso [is.logical()] +#' @seealso [length()] +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_true +#' chk_true(TRUE) +#' try(chk_true(1)) +#' @export +chk_true <- function(x, x_name = NULL) { + if (vld_true(x)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + abort_chk(x_name, " must be TRUE", x = x) +} + +#' @describeIn chk_true Validate TRUE +#' +#' @examples +#' # vld_true +#' vld_true(TRUE) +#' vld_true(FALSE) +#' vld_true(NA) +#' vld_true(0) +#' vld_true(c(TRUE, TRUE)) +#' @export +vld_true <- function(x) is.logical(x) && length(x) == 1L && !anyNA(x) && x diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-tz.R b/chk.Rcheck/00_pkg_src/chk/R/chk-tz.R new file mode 100644 index 00000000..8684cd63 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-tz.R @@ -0,0 +1,44 @@ +#' Check Time Zone +#' +#' @description +#' Checks if non-missing valid scalar timezone using +#' +#' `is.character(x) && length(x) == 1L && !anyNA(x) && x %in% OlsonNames()` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family tz_checkers +#' @family date_checkers +#' @family scalar_checkers +#' +#' @seealso [length()] +#' @seealso [OlsonNames()] +#' @seealso [is.character()] +#' +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' chk_tz("UTC") +#' try(chk_tz("TCU")) +#' @export +chk_tz <- function(x, x_name = NULL) { + if (vld_tz(x)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + abort_chk(x_name, " must be a tz (non-missing scalar character of a recognized timezone)", x = x) +} + +#' @describeIn chk_tz Validate Time Zone +#' +#' @examples +#' vld_tz("UTC") +#' vld_tz("TCU") +#' @export +vld_tz <- function(x) { + is.character(x) && length(x) == 1L && !anyNA(x) && + x %in% OlsonNames() +} diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-unique.R b/chk.Rcheck/00_pkg_src/chk/R/chk-unique.R new file mode 100644 index 00000000..02bbd0d6 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-unique.R @@ -0,0 +1,45 @@ +#' Check Unique +#' +#' @description +#' Checks if unique using +#' +#' `!anyDuplicated(x, incomparables = incomparables)` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family misc_checkers +#' +#' @seealso [anyDuplicated()] +#' +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_unique +#' chk_unique(c(NA, 2)) +#' try(chk_unique(c(NA, NA, 2))) +#' chk_unique(c(NA, NA, 2), incomparables = NA) +#' @export +chk_unique <- function(x, incomparables = FALSE, x_name = NULL) { + if (vld_unique(x, incomparables = incomparables)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + abort_chk(x_name, " must be unique", x = x, incomparables = incomparables) +} + +#' @describeIn chk_unique Validate Unique +#' +#' @examples +#' # vld_unique +#' vld_unique(NULL) +#' vld_unique(numeric(0)) +#' vld_unique(c(NA, 2)) +#' vld_unique(c(NA, NA, 2)) +#' vld_unique(c(NA, NA, 2), incomparables = NA) +#' @export +vld_unique <- function(x, incomparables = FALSE) { + !.anyDuplicated(x, incomparables = incomparables) +} diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-unused.R b/chk.Rcheck/00_pkg_src/chk/R/chk-unused.R new file mode 100644 index 00000000..295e7e98 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-unused.R @@ -0,0 +1,46 @@ +#' Check ... Unused +#' +#' @description +#' Checks if ... is unused +#' +#' `length(list(...)) == 0L` +#' +#' @inheritParams params +#' @inherit params return +#' @return The `chk_` function throws an informative error if the test fails. +#' +#' @family ellipsis_checkers +#' +#' @seealso [length()] +#' +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_unused +#' fun <- function(x, ...) { +#' chk_unused(...) +#' x +#' } +#' fun(1) +#' try(fun(1, 2)) +#' @export +chk_unused <- function(...) { + if (!length(list(...))) { + return(invisible()) + } + abort_chk("`...` must be unused") +} + +#' @describeIn chk_unused Validate ... Unused +#' +#' @examples +#' # vld_unused +#' fun <- function(x, ...) { +#' vld_unused(...) +#' } +#' fun(1) +#' try(fun(1, 2)) +#' @export +vld_unused <- function(...) length(list(...)) == 0L diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-used.R b/chk.Rcheck/00_pkg_src/chk/R/chk-used.R new file mode 100644 index 00000000..86288859 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-used.R @@ -0,0 +1,45 @@ +#' Check ... Used +#' +#' @description +#' Checks if is ... used using +#' +#' `length(list(...)) != 0L` +#' +#' @inheritParams params +#' @inherit params return +#' @return The `chk_` function throws an informative error if the test fails. +#' +#' @family ellipsis_checkers +#' +#' @seealso [length()] +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_used +#' fun <- function(x, ...) { +#' chk_used(...) +#' x +#' } +#' try(fun(1)) +#' fun(1, 2) +#' @export +chk_used <- function(...) { + if (vld_used(...)) { + return(invisible()) + } + abort_chk("`...` must be used") +} + +#' @describeIn chk_used Validate ... Used +#' +#' @examples +#' # vld_used +#' fun <- function(x, ...) { +#' vld_used(...) +#' } +#' fun(1) +#' fun(1, 2) +#' @export +vld_used <- function(...) length(list(...)) != 0L diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-valid-name.R b/chk.Rcheck/00_pkg_src/chk/R/chk-valid-name.R new file mode 100644 index 00000000..47591828 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-valid-name.R @@ -0,0 +1,38 @@ +#' Check Valid Name +#' +#' @description +#' Checks if valid name using +#' +#' `identical(make.names(x[!is.na(x)]), as.character(x[!is.na(x)]))` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family name_checkers +#' +#' @seealso [identical()] +#' @seealso [make.names()] +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_valid_name +#' chk_valid_name("text") +#' try(chk_valid_name(".1")) +#' @export +chk_valid_name <- function(x, x_name = NULL) { + if (vld_valid_name(x)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + abort_chk(x_name, " must be valid name%s", n = length(x)) +} + +#' @describeIn chk_valid_name Validate Valid Name +#' +#' @examples +#' # vld_valid_name +#' vld_valid_name(".1") +#' @export +vld_valid_name <- function(x) identical(make.names(x[!is.na(x)]), as.character(x[!is.na(x)])) diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-vector.R b/chk.Rcheck/00_pkg_src/chk/R/chk-vector.R new file mode 100644 index 00000000..c00c127b --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-vector.R @@ -0,0 +1,43 @@ +#' Check Vector +#' +#' @description +#' Checks if is a vector using +#' +#' `(is.atomic(x) && !is.matrix(x) && !is.array(x)) || is.list(x)` +#' +#' @details +#' `is.vector(x)` is not reliable because it returns TRUE only +#' if the object is a vector with no attributes apart from names. +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family data_structure_checkers +#' +#' @seealso [is.atomic()], [is.matrix()], [is.array()], [is.list()] +#' +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_vector +#' chk_vector(1) +#' chk_vector(list()) +#' try(chk_vector(matrix(1))) +#' @export +chk_vector <- function(x, x_name = NULL) { + if (vld_vector(x)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + abort_chk(x_name, " must be a vector", x = x) +} + +#' @describeIn chk_vector Validate Vector +#' +#' @examples +#' # vld_vector +#' vld_vector(1) +#' @export +vld_vector <- function(x) (is.atomic(x) && !is.matrix(x) && !is.array(x)) || is.list(x) diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-whole-number.R b/chk.Rcheck/00_pkg_src/chk/R/chk-whole-number.R new file mode 100644 index 00000000..875009d4 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-whole-number.R @@ -0,0 +1,52 @@ +#' Check Whole Number +#' +#' @description +#' Checks if non-missing integer scalar or double equivalent using +#' +#' `vld_number(x) && (is.integer(x) || vld_true(all.equal(x, trunc(x))))` +#' +#' **Pass**: `1`, `2L`, `1e10`, `-Inf` +#' +#' **Fail**: `"a"`, `1:3`, `NA_integer_`, `log(10)` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family scalar_checker +#' @family whole_number_checkers +#' +#' @seealso [is.integer()] +#' @seealso [vld_true()] +#' @seealso [vld_number()] +#' +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_whole_number +#' chk_whole_number(2) +#' try(chk_whole_number(1.1)) +#' @export +chk_whole_number <- function(x, x_name = NULL) { + if (vld_whole_number(x)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + abort_chk( + x_name, + " must be a whole number (non-missing integer scalar or double equivalent)", + x = x + ) +} + +#' @describeIn chk_whole_number Validate Whole Number +#' +#' @examples +#' # vld_whole_number +#' vld_whole_number(2) +#' @export +vld_whole_number <- function(x) { + vld_number(x) && + (is.integer(x) || vld_true(all.equal(x, trunc(x)))) +} diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-whole-numeric.R b/chk.Rcheck/00_pkg_src/chk/R/chk-whole-numeric.R new file mode 100644 index 00000000..b31028aa --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-whole-numeric.R @@ -0,0 +1,52 @@ +#' Check Whole Numeric +#' +#' @description +#' Checks if integer vector or double equivalent using +#' +#' `is.integer(x) || (is.double(x) && vld_true(all.equal(x, as.integer(x))))` +#' +#' @inheritParams params +#' @inherit params return +#' +#' @family whole_number_checkers +#' +#' @seealso [is.integer()] +#' @seealso [is.double()] +#' @seealso [vld_true()] +#' @seealso [all.equal()] +#' @seealso For more details about the use of this function, +#' please read the article +#' `vignette("chk-families")`. +#' +#' @examples +#' # chk_whole_numeric +#' chk_whole_numeric(1) +#' try(chk_whole_numeric(1.1)) +#' @export +chk_whole_numeric <- function(x, x_name = NULL) { + if (vld_whole_numeric(x)) { + return(invisible(x)) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + abort_chk( + x_name, + " must be a whole numeric vector (integer vector or double equivalent)", + x = x + ) +} + +#' @describeIn chk_whole_numeric Validate Whole Numeric +#' +#' @examples +#' # vld_whole_numeric +#' vld_whole_numeric(1) +#' vld_whole_numeric(NA_real_) +#' vld_whole_numeric(1:2) +#' vld_whole_numeric(double(0)) +#' vld_whole_numeric(TRUE) +#' vld_whole_numeric(1.5) +#' @export +vld_whole_numeric <- function(x) { + is.integer(x) || (is.double(x) && + vld_true(all.equal(x[!is.na(x)], trunc(x[!is.na(x)])))) +} diff --git a/chk.Rcheck/00_pkg_src/chk/R/chk-wnum.R b/chk.Rcheck/00_pkg_src/chk/R/chk-wnum.R new file mode 100644 index 00000000..63ab7d5d --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chk-wnum.R @@ -0,0 +1,56 @@ +#' Check Whole Numeric Scalar +#' +#' @description +#' Checks if whole numeric scalar using +#' +#' `is.numeric(x) && length(x) == 1L && (is.integer(x) || vld_true(all.equal(x, trunc(x))))` +#' +#' `r lifecycle::badge("deprecated")` +#' +#' @inheritParams params +#' @inherit params return +#' +#' +#' @family deprecated +#' +#' @examples +#' # chk_wnum +#' chk_wnum(1) +#' try(chk_wnum(1.1)) +#' @export +chk_wnum <- function(x, x_name = NULL) { + if (vld_wnum(x)) { + return(invisible(x)) + } + deprecate_soft( + "0.6.1", + what = "chk::chk_wnum()", + details = "Please use `chk::chk_scalar(x);` `chk::chk_whole_numeric(x)` instead", + id = "chk_wnum" + ) + if (is.null(x_name)) x_name <- deparse_backtick_chk((substitute(x))) + abort_chk(x_name, " must be a whole numeric scalar", x = x) +} + +#' @describeIn chk_wnum Validate Whole Numeric Scalar +#' +#' `r lifecycle::badge("deprecated")` +#' +#' @examples +#' # vld_wnum +#' vld_wnum(1) +#' vld_wnum(double(0)) +#' vld_wnum(NA_real_) +#' vld_wnum(c(1, 1)) +#' vld_wnum(1L) +#' @export +vld_wnum <- function(x) { + deprecate_soft( + "0.6.1", + what = "chk::chk_wnum()", + details = "Please use `chk::chk_scalar(x);` `chk::chk_whole_numeric(x)` instead", + id = "chk_wnum" + ) + + is.numeric(x) && length(x) == 1L && (is.integer(x) || vld_true(all.equal(x, trunc(x)))) +} diff --git a/chk.Rcheck/00_pkg_src/chk/R/chkor-vld.R b/chk.Rcheck/00_pkg_src/chk/R/chkor-vld.R new file mode 100644 index 00000000..c19ef4cd --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chkor-vld.R @@ -0,0 +1,79 @@ +try_chk <- function(quo) { + catch_cnd(eval_tidy(quo), classes = "error") +} + +try_msg <- function(x) { + # FIXME: Tests fail when the code below is changed to conditionMessage(x) + # because rlang implements conditionMessage.rlang_error() . + # Does that output look satisfactory? + conditionMessage.condition(x) +} + +chkor_quos <- function(quos) { + n <- length(quos) + if (n == 0L) { + return(invisible()) + } + + msg <- character(n) + for (i in seq_len(n)) { + try <- try_chk(quos[[i]]) + if (is.null(try)) { + return(invisible()) + } + msg[[i]] <- try_msg(try) + } + msg <- unique(msg) + if (length(msg) > 1) { + msg <- p0(msg, collapse = "\n* ") + msg <- p0("At least one of the following conditions must be met:\n* ", msg) + } + abort_chk(msg) +} + +vld__to_chk_ <- function(quo) { + str <- deparse(quo) + str <- sub("^vld_", "chk_", str) + str2lang(str) +} + +#' Chk OR +#' +#' @param ... Multiple `vld_` calls. +#' +#' A common mistake is to pass `chk_` calls. +#' +#' `chkor_vld()` is relatively slow. +#' If at all possible use [chk_null_or()] or first test using the individual +#' `vld_` functions and then call `chkor_vld()` to generate an informative +#' error message. +#' +#' @return An informative error if the test fails. +#' +#' @seealso [chk_null_or()] +#' +#' @export +#' +#' @examples +#' chkor_vld() +#' chkor_vld(vld_flag(TRUE)) +#' try(chkor_vld(vld_flag(1))) +#' try(chkor_vld(vld_flag(1), vld_flag(2))) +#' chkor_vld(vld_flag(1), vld_flag(TRUE)) +chkor_vld <- function(...) { + quos <- enquos(...) + + n <- length(quos) + if (n == 0L) { + return(invisible()) + } + for (quo in quos) { + if (eval_tidy(quo)) { + return(invisible()) + } + } + for (i in seq_len(n)) { + quos[[i]] <- quo_set_expr(quos[[i]], vld__to_chk_(quo_get_expr(quos[[i]]))) + } + chkor_quos(quos) +} diff --git a/chk.Rcheck/00_pkg_src/chk/R/chkor.R b/chk.Rcheck/00_pkg_src/chk/R/chkor.R new file mode 100644 index 00000000..bc734bce --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/chkor.R @@ -0,0 +1,26 @@ +#' Check OR +#' +#' The `chkor()` function has been deprecated for the faster `chkor_vld()`. +#' +#' `r lifecycle::badge("deprecated")` +#' +#' @param ... Multiple `chk_` functions. +#' +#' @return An informative error if the test fails. +#' +#' @seealso [chk_null_or()] +#' +#' @export +#' +#' @examples +#' chkor() +#' chkor(chk_flag(TRUE)) +#' try(chkor(chk_flag(1))) +#' try(chkor(chk_flag(1), chk_flag(2))) +#' chkor(chk_flag(1), chk_flag(TRUE)) +chkor <- function(...) { + lifecycle::deprecate_soft("0.6.1", "chkor()", "chkor_vld()") + quos <- enquos(...) + + invisible(chkor_quos(quos)) +} diff --git a/chk.Rcheck/00_pkg_src/chk/R/deprecated.R b/chk.Rcheck/00_pkg_src/chk/R/deprecated.R new file mode 100644 index 00000000..cb351ebe --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/deprecated.R @@ -0,0 +1,186 @@ +#' Deprecated functions +#' +#' +#' Deprecated `chk_()` functions. +#' +#' @family deprecated +#' +#' @inheritParams chk_flag +#' @keywords internal +#' @name chk_deprecated +NULL + +#' @describeIn chk_deprecated Check Directories Exist +#' +#' `r lifecycle::badge("deprecated")` +#' +#' Replace with `[chk_all](x, [chk_dir])` +#' +#' @export +chk_dirs <- function(x) { + deprecate_warn("0.2.0", + what = "chk::chk_dirs()", + details = "Please use `chk_all(x, chk_dir)` instead" + ) + chk_all(x, chk_dir) +} + +#' @describeIn chk_deprecated Check Files Exist +#' +#' `r lifecycle::badge("deprecated")` +#' +#' Replace with `[chk_all](x, [chk_file])` +#' +#' @export +chk_files <- function(x) { + deprecate_warn("0.2.0", + what = "chk::chk_files()", + details = "Please use `chk_all(x, chk_file)` instead" + ) + chk_all(x, chk_file) +} + +#' @describeIn chk_deprecated Check Has +#' +#' `r lifecycle::badge("deprecated")` +#' +#' Replace by [chk_superset()] +#' +#' @export +chk_has <- function(x, values, x_name = NULL) { + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + chk_superset(x, values, x_name = x_name) + deprecate_warn("0.2.0", + what = "chk::chk_has()", + with = "chk::chk_superset()" + ) + invisible() +} + +#' @describeIn chk_deprecated Check In +#' +#' `r lifecycle::badge("deprecated")` +#' +#' Replace by [chk_subset()] +#' +#' @export +chk_in <- function(x, values, x_name = NULL) { + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + chk_subset(x, values, x_name = x_name) + deprecate_warn("0.2.0", + what = "chk::chk_in()", + with = "chk::chk_subset()" + ) + invisible() +} + +#' @describeIn chk_deprecated Check No Missing Values +#' +#' `r lifecycle::badge("deprecated")` +#' +#' Replace with [chk_not_any_na()] +#' +#' @export +chk_no_missing <- function(x, x_name = NULL) { + deprecate_warn("0.2.0", + what = "chk::chk_no_missing()", with = "chk::chk_not_any_na()", + id = "chk_no_missing" + ) + if (vld_no_missing(x)) { + return(invisible()) + } + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + abort_chk(x_name, " must not have missing values", x = x) +} + +#' @describeIn chk_deprecated Validate No Missing Values +#' +#' `r lifecycle::badge("deprecated")` +#' +#' Replace with [vld_not_any_na()] +#' +#' @export +vld_no_missing <- function(x) { + deprecate_warn("0.2.0", + what = "chk::vld_no_missing()", with = "chk::vld_not_any_na()", + id = "chk_no_missing" + ) + !anyNA(x) +} + +#' @describeIn chk_deprecated Turns checking off +#' +#' `r lifecycle::badge("deprecated")` +#' +#' This approach is no longer recommended +#' +#' @export +chk_off <- function() { + deprecate_stop("0.2.0", + what = "chk::chk_off()", + details = "This approach is no longer recommended" + ) + options(chk.on = FALSE) +} + +#' @describeIn chk_deprecated Turns checking on +#' +#' `r lifecycle::badge("deprecated")` +#' +#' This approach is no longer recommended +#' +#' @export +chk_on <- function() { + deprecate_stop("0.2.0", + what = "chk::chk_on()", + details = "This approach is no longer recommended" + ) + options(chk.on = TRUE) +} + +#' @describeIn chk_deprecated Tests checking on +#' +#' `r lifecycle::badge("deprecated")` +#' +#' This approach is no longer recommended +#' +#' @export +is_chk_on <- function() { + deprecate_stop("0.2.0", + what = "chk::is_chk_on()", + details = "This approach is no longer recommended" + ) + getOption("chk.on", TRUE) +} + +#' @describeIn chk_deprecated Check Proportion +#' +#' `r lifecycle::badge("deprecated")` +#' +#' Replace by `[chk_number](x); [chk_range](x)` +#' +#' @export +chk_proportion <- function(x, x_name = NULL) { + deprecate_warn("0.2.0", + what = "chk::chk_proportion()", + details = "Please use `chk_number(x)` or `chk_range(x)` instead" + ) + if (is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) + chk_number(x) + chk_range(x) +} + +#' @describeIn chk_deprecated Deparse Backtick +#' +#' `r lifecycle::badge("deprecated")` +#' +#' Replace with [deparse_backtick_chk()] +#' +#' @export +deparse_backtick <- function(x) { + deprecate_warn("0.2.0", + what = "chk::deparse_backtick()", + with = "chk::deparse_backtick_chk()" + ) + deparse_backtick_chk(x) +} diff --git a/chk.Rcheck/00_pkg_src/chk/R/err.R b/chk.Rcheck/00_pkg_src/chk/R/err.R new file mode 100644 index 00000000..b3a05d9e --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/err.R @@ -0,0 +1,128 @@ +#' Construct Tidyverse Style Message +#' +#' If `tidy = TRUE` constructs a tidyverse style message by +#' +#' \itemize{ +#' \item Capitalizing the first character if possible. +#' \item Adding a trailing . if missing. +#' } +#' +#' Also if `n != NULL` replaces the recognized `sprintf`-like types. +#' +#' @section `sprintf`-like types: +#' +#' The following recognized `sprintf`-like types can be used in a message: +#' +#' \describe{ +#' \item{`n`}{The value of n.} +#' \item{`s`}{'' if n == 1 otherwise 's'} +#' \item{`r`}{'is' if n == 1 otherwise 'are'} +#' \item{`y`}{'y' if n == 1 otherwise 'ie'} +#' } +#' +#' @param ... Multiple objects that are converted to a string using +#' `paste0(..., collapse = '')`. +#' @param n The value of n for converting `sprintf`-like types. +#' @param tidy A flag specifying whether capitalize the first character and add a missing period. +#' +#' @return A string of the message. +#' @export +#' +#' @examples +#' message_chk("there %r %n", " problem director%y%s") +#' message_chk("there %r %n", " problem director%y%s", n = 1) +#' message_chk("There %r %n", " problem director%y%s.", n = 3) +message_chk <- function(..., n = NULL, tidy = TRUE) { + string <- p0(..., collapse = "") + if (!is.null(n)) { + string <- gsub("%r", if (n == 1) "is" else "are", string, fixed = TRUE) + string <- gsub("%s", if (n == 1) "" else "s", string, fixed = TRUE) + string <- gsub("%y", if (n == 1) "y" else "ie", string, fixed = TRUE) + string <- gsub("%n", n, string, fixed = TRUE) + } + if (vld_true(tidy)) { + if (!grepl("([.]|[?]|[!])$", string)) string <- p0(string, ".") + string <- p0(toupper(substr(string, 1, 1)), substr(string, 2, nchar(string))) + } + string +} + +#' Stop, Warning and Message Messages +#' +#' The functions call [message_chk()] to process +#' the message and then +#' [rlang::abort()], [rlang::warn()] and +#' [rlang::inform()], respectively. +#' +#' The user can set the subclass. +#' @param .subclass A string of the class of the error message. +#' @inheritParams base::stop +#' @inheritParams rlang::abort +#' @inheritParams message_chk +#' @name err +NULL + +#' @describeIn err Error +#' +#' @export +#' +#' @examples +#' +#' # err +#' try(err("there %r %n problem value%s", n = 2)) +err <- function(..., n = NULL, tidy = TRUE, .subclass = NULL, class = NULL, call = rlang::caller_call(3)) { + if (!is.null(.subclass)) { + deprecate_soft("0.8.1", "err(.subclass)", "err(class)") + class <- .subclass + } + args <- list2(...) + named <- (names2(args) != "") + msg <- exec(p0, !!!args[!named], collapse = "") + msg <- message_chk(msg, n = n, tidy = tidy) + + if (!is.null(args$y)) { + msg <- paste0( + msg, + "\nUse `rlang::last_error()$y` to show the object compared to." + ) + } + + rlang::abort( + msg, + class = class, + !!!args[named], + call = call + ) +} + +#' @describeIn err Warning +#' +#' @export +#' +#' @examples +#' +#' # wrn +#' wrn("there %r %n problem value%s", n = 2) +wrn <- function(..., n = NULL, tidy = TRUE, .subclass = NULL, class = NULL) { + if (!is.null(.subclass)) { + deprecate_soft("0.8.1", "wrn(.subclass)", "wrn(class)") + class <- .subclass + } + warn(message_chk(..., n = n, tidy = tidy), class = class) +} + +#' @describeIn err Message +#' +#' @export +#' +#' @examples +#' +#' # msg +#' msg("there %r %n problem value%s", n = 2) +msg <- function(..., n = NULL, tidy = TRUE, .subclass = NULL, class = NULL) { + if (!is.null(.subclass)) { + deprecate_soft("0.8.1", "msg(.subclass)", "msg(class)") + class <- .subclass + } + inform(message_chk(..., n = n, tidy = tidy), class = class) +} diff --git a/chk.Rcheck/00_pkg_src/chk/R/expect-chk-error.R b/chk.Rcheck/00_pkg_src/chk/R/expect-chk-error.R new file mode 100644 index 00000000..ed2a3ccc --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/expect-chk-error.R @@ -0,0 +1,20 @@ +#' Expect Chk Error +#' +#' [expect_chk_error()] checks that code throws an error +#' of class `"chk_error"` with a message that matches regexp. +#' See below for more details. +#' +#' @inherit testthat::expect_error +#' @param class Must be NULL. +#' @export +#' +#' @examples +#' expect_chk_error(chk_true(FALSE)) +#' try(expect_chk_error(chk_false(FALSE))) +expect_chk_error <- function(object, regexp = NULL, ..., info = NULL, label = NULL, class = NULL) { + if (!is_installed("testthat")) { + stop("`testhat` must be installed.") + } + if (!is.null(class)) stop("`class` must be NULL.") + testthat::expect_error(object, regexp = regexp, class = "chk_error", ..., info = info, label = label) +} diff --git a/chk.Rcheck/00_pkg_src/chk/R/internal.R b/chk.Rcheck/00_pkg_src/chk/R/internal.R new file mode 100644 index 00000000..552d9b45 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/internal.R @@ -0,0 +1,16 @@ +# necessary hack because for data frames +# argument 'incomparables != FALSE' is not used (yet) +.anyDuplicated <- function(x, incomparables = FALSE) { + if (vld_false(incomparables) || is.null(incomparables) || !length(incomparables)) { + return(anyDuplicated(x)) + } + if (!is.data.frame(x)) { + return(anyDuplicated(x, incomparables = incomparables)) + } + + y <- as.data.frame(lapply(x, function(col, y) col %in% y, y = incomparables)) + y <- apply(y, 1, any) + x <- x[!y, , drop = FALSE] + + anyDuplicated(x) +} diff --git a/chk.Rcheck/00_pkg_src/chk/R/new-duplicated.R b/chk.Rcheck/00_pkg_src/chk/R/new-duplicated.R new file mode 100644 index 00000000..e50dbf2f --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/new-duplicated.R @@ -0,0 +1,56 @@ +# from https://stevenmortimer.com/the-unfinished-duplicated-function/ +new_duplicated <- function(x, incomparables = FALSE, fromLast = FALSE, ...) { + if (!identical(incomparables, FALSE)) { + n <- ncol(x) + nmx <- names(x) + nmincomparables <- names(incomparables) + lincomparables <- length(incomparables) + if (is.null(nmincomparables)) { + if (lincomparables < n) { + # pad any incomparables lists with the default value if list is shorter than the number columns in the supplied data.frame + tmp <- c(incomparables, as.list(rep_len(FALSE, n - lincomparables))) + names(tmp) <- nmx + incomparables <- tmp + } + if (lincomparables > n) { + # if the list is unnamed and there are more elements in the list than there are columns, then only first n elements + warning(paste("more columns in 'incomparables' than x, only using the first", n, "elements")) + incomparables <- incomparables[1:n] + } + } else { + # for named lists, find match, else default value + tmp <- as.list(rep_len(FALSE, n)) + names(tmp) <- nmx + i <- match(nmincomparables, nmx, 0L) + if (any(i <= 0L)) { + warning("not all columns named in 'incomparables' exist") + } + tmp[i[i > 0L]] <- incomparables[i > 0L] + incomparables <- tmp[nmx] + } + + # first determine duplicates, then override when an incomparable value is found in a row since the existence of even 1 incomparable value in a row means it cannot be a duplicate + res <- duplicated(do.call("paste", c(x, sep = "\r")), fromLast = fromLast) + + # for better performance only bother with the columns that have incomparable values not set to the default: !identical(x, FALSE) + run_incomp_check <- sapply(incomparables, FUN = function(x) { + !identical(x, FALSE) + }) + if (sum(run_incomp_check) > 0L) { + incomp_check <- mapply(FUN = function(column, incomparables) { + match(column, incomparables) + }, x[run_incomp_check], incomparables[run_incomp_check]) + # any rows with an incomparable match means, TRUE, it can override the duplicated result + overwrite <- apply(data.frame(incomp_check), 1, function(x) { + any(!is.na(x)) + }) + res[overwrite] <- FALSE + } + + return(res) + } else if (length(x) != 1L) { + duplicated(do.call("paste", c(x, sep = "\r")), fromLast = fromLast) + } else { + duplicated(x[[1L]], fromLast = fromLast, ...) + } +} diff --git a/chk.Rcheck/00_pkg_src/chk/R/p.R b/chk.Rcheck/00_pkg_src/chk/R/p.R new file mode 100644 index 00000000..b68f7e67 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/p.R @@ -0,0 +1,25 @@ +#' Concatenate Strings +#' +#' A wrapper on [base::paste()]. +#' +#' @inheritParams base::paste +#' +#' @return A character vector. +#' @export +#' +#' @examples +#' p("a", "b") +#' p(c("a", "b"), collapse = " ") +p <- function(..., sep = " ", collapse = NULL) { + paste(..., sep = sep, collapse = collapse) +} + +#' @describeIn p A wrapper on [base::paste0()] +#' @export +#' +#' @examples +#' p0("a", "b") +#' p0(c("a", "b"), collapse = "") +p0 <- function(..., collapse = NULL) { + paste0(..., collapse = collapse) +} diff --git a/chk.Rcheck/00_pkg_src/chk/R/params.R b/chk.Rcheck/00_pkg_src/chk/R/params.R new file mode 100644 index 00000000..eefa3f10 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/params.R @@ -0,0 +1,51 @@ +#' Parameter Descriptions for chk Package +#' +#' Default parameter descriptions which may be overridden in individual +#' functions. +#' +#' A flag is a non-missing logical scalar. +#' +#' A string is a non-missing character scalar. +#' +#' @param x The object to check. +#' @param x_name A string of the name of object x or NULL. +#' @param y An object to check against. +#' @param chk A flag specifying whether to check the other parameters. +#' @param chk_fun A chk_ function. +#' @param tolerance A non-negative numeric scalar. +#' @param ext A character vector of the permitted file extensions +#' (without the .). +#' @param exists A flag specifying whether the files/directories must (or must not) exist. +#' @param value A non-missing scalar of a value. +#' @param range A non-missing sorted vector of length 2 of the lower and +#' upper permitted values. +#' @param inclusive A flag specifying whether the range is exclusive. +#' @param regexp A string of a regular expression. +#' @param values A vector of the permitted values. +#' @param class A character vector specifying the possible class values. +#' @param length A count of the length. +#' @param upper A count of the max length. +#' @param formals A count of the number of formal arguments. +#' @param incomparables A vector of values that cannot be compared. +#' FALSE means that all values can be compared. +#' @param by A character vector specifying the column names to join x and y on. +#' If named the names are the corresponding columns in x. +#' @param exclusive A flag specifying whether x must only include columns named in values. +#' @param order A flag specifying whether the order of columns in x must match names in values. +#' @param nrow A flag or a whole numeric vector of the value, value range or possible values. +#' @param key A character vector of the columns that represent a unique key. +#' @param vld_fun A vld_ function. +#' @param ... Additional arguments. +#' @return +#' The `chk_` function throws an informative error if the test fails or +#' returns the original object if successful so it can used in pipes. +#' +#' The `vld_` function returns a flag indicating whether the test was met. +#' +#' @keywords internal +#' @aliases parameters arguments args +#' @usage NULL +# nocov start +params <- function(...) NULL +# nocov end + diff --git a/chk.Rcheck/00_pkg_src/chk/R/utils.R b/chk.Rcheck/00_pkg_src/chk/R/utils.R new file mode 100644 index 00000000..3e9cc0db --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/R/utils.R @@ -0,0 +1,48 @@ +#' Abort Check +#' +#' A wrapper on [err()] that sets the subclass to be `'chk_error'`. +#' +#' It is exported to allow users to easily construct their own `chk_` functions. +#' +#' @inheritParams message_chk +#' @inheritParams rlang::abort +#' @return Throws an error of class `'chk_error'`. +#' @seealso [err()] +#' @export +#' +#' @examples +#' try(abort_chk("x must be NULL")) +#' try(abort_chk("`x` must be NULL")) +#' try(abort_chk("there %r %n problem value%s", n = 1)) +#' try(abort_chk("there %r %n problem value%s", n = 1.5)) +abort_chk <- function(..., n = NULL, tidy = TRUE, call = rlang::caller_call(2)) { + err(..., n = n, tidy = tidy, class = "chk_error", call = call) +} + +#' Deparse Backtick +#' +#' `deparse_backtick_chk` is a wrapper on [deparse()] +#' and `backtick_chk`. +#' +#' It is exported to allow users to easily construct their own `chk_` functions. +#' +#' @param x A substituted object to deparse. +#' +#' @return A string of the backticked substituted object. +#' @seealso [deparse()] +#' @export +#' +#' @examples +#' +#' # deparse_backtick_chk +#' deparse_backtick_chk(2) +#' deparse_backtick_chk(2^2) +deparse_backtick_chk <- function(x) backtick_chk(deparse(x)) + +#' @describeIn deparse_backtick_chk Backtick +#' @export +backtick_chk <- function(x) p0("`", unbacktick_chk(x), "`") + +#' @describeIn deparse_backtick_chk Unbacktick +#' @export +unbacktick_chk <- function(x) gsub("`", "", x) diff --git a/chk.Rcheck/00_pkg_src/chk/README.md b/chk.Rcheck/00_pkg_src/chk/README.md new file mode 100644 index 00000000..829e2545 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/README.md @@ -0,0 +1,121 @@ + + + +# chk chk logo of completed tick mark + + + +[![Lifecycle: +stable](https://img.shields.io/badge/lifecycle-stable-brightgreen.svg)](https://lifecycle.r-lib.org/articles/stages.html#stable) +[![R-CMD-check](https://github.com/poissonconsulting/chk/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/poissonconsulting/chk/actions/workflows/R-CMD-check.yaml) +[![Codecov test +coverage](https://codecov.io/gh/poissonconsulting/chk/graph/badge.svg)](https://app.codecov.io/gh/poissonconsulting/chk) +[![License: +MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://opensource.org/license/mit) +[![CRAN +status](https://www.r-pkg.org/badges/version/chk)](https://cran.r-project.org/package=chk) +![CRAN downloads](https://cranlogs.r-pkg.org/badges/chk) + + +`chk` is an R package for developers to check user-supplied function +arguments. + +It is designed to be simple, customizable and fast. + +## Demonstration + +`chk` provides simple commonly used checks as (`chk_` functions) which +can be combined together for more complex checking. + +``` r +library(chk) + +y <- "a" + +chk_string(y) +chk_flag(y) +#> Error: +#> ! `y` must be a flag (TRUE or FALSE). + +data <- data.frame(x = 1:2) +chk_range(nrow(data), c(3, 8)) +#> Error: +#> ! `nrow(data)` must be between 3 and 8, not 2. +``` + +Or used inside functions to test user-provided arguments. + +``` r +my_fun <- function(x) { + chk_flag(x) + x +} +my_fun(TRUE) +#> [1] TRUE +my_fun(NA) +#> Error in `my_fun()`: +#> ! `x` must be a flag (TRUE or FALSE). +``` + +Error messages follow the [tidyverse style +guide](https://style.tidyverse.org/errors.html) while the errors +themselves are [rlang +errors](https://rlang.r-lib.org/reference/abort.html) of class +`chk_error`. + +## Information + +For more information see the [Get +Started](https://poissonconsulting.github.io/chk/articles/chk.html) +vignette. + +## Installation + +### Release + +To install the release version from +[CRAN](https://CRAN.R-project.org/package=chk). + +``` r +install.packages("chk") +``` + +The website for the release version is at +. + +### Development + +To install the development version from +[GitHub](https://github.com/poissonconsulting/chk) + +``` r +# install.packages("remotes") +remotes::install_github("poissonconsulting/chk") +``` + +or from [r-universe](https://poissonconsulting.r-universe.dev/chk). + +``` r +install.packages("chk", repos = c("https://poissonconsulting.r-universe.dev", "https://cloud.r-project.org")) +``` + +## Inspiration + +- [datacheckr](https://github.com/poissonconsulting/datacheckr/) +- [checkr](https://github.com/poissonconsulting/checkr/) +- [err](https://github.com/poissonconsulting/err/) +- [testthat](https://github.com/r-lib/testthat/) + +## Contribution + +Please report any +[issues](https://github.com/poissonconsulting/chk/issues). + +[Pull requests](https://github.com/poissonconsulting/chk/pulls) are +always welcome. + +## Code of Conduct + +Please note that the chk project is released with a [Contributor Code of +Conduct](https://contributor-covenant.org/version/2/0/CODE_OF_CONDUCT.html). +By contributing to this project, you agree to abide by its terms. diff --git a/chk.Rcheck/00_pkg_src/chk/build/vignette.rds b/chk.Rcheck/00_pkg_src/chk/build/vignette.rds new file mode 100644 index 0000000000000000000000000000000000000000..d9f8b2c00ce3190266fdf7fe810f04ebb4088d84 GIT binary patch literal 231 zcmV6=7w$M`(rUv-%_XQcrGg@utaA(cIsb5T zWSV@W!X<>CFKq$MgcVd8Zj670agGyFYBGis(WPdQA3) hZ5W1rnJ6uAD-%iR6U=dxHP8>L{{Rcl=t#~1000anV( + %\VignetteIndexEntry{chk Families} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + +```{r, include = FALSE} +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#>" +) +library(chk) +``` + +## Introduction +The `vld_` functions are used within the `chk_` functions. +The `chk_` functions (and their `vld_` equivalents) can be divided into the following families. + +In the code in this examples, we will use `vld_*` functions + +If you want to learn more about the logic behind some of the functions explained here, we recommend reading the book [Advanced R](https://adv-r.hadley.nz/) (Wickham, 2019). + +For reasons of space, the `x_name = NULL` argument is not shown. +For a more simplified list of the `chk` functions, you can see the [Reference](https://poissonconsulting.github.io/chk/reference/index.html) section. + +## `chk_` Functions +### Overview + +```{r chk_, echo = FALSE, out.width= "100%", fig.align='center', fig.alt = "Classification of the chk functions by family"} +knitr::include_graphics("chk_diagram_II.png") +``` + +### Missing Input Checker +Check if the function input is missing or not + +`chk_missing` function uses `missing()` +to check if an argument has been left out when the function is called. + +Function | Code +:- | :--- +`chk_missing()` | `missing()` +`chk_not_missing()` | `!missing()` + +### `...` Checker +Check if the function input comes from `...` (`dot-dot-dot`) or not + +The functions `chk_used(...)` and `chk_unused(...)` check +if any arguments have been provided through `...` (called `dot-dot-dot` or ellipsis), which is commonly used in R to allow a variable number of arguments. + +Function | Code +:- | :--- +`chk_used(...)` | `length(list(...)) != 0L` +`chk_unused(...)` | `length(list(...)) == 0L` + +### External Data Source Checkers +Check if the function input is a valid external data source. + +These `chk` functions check the existence of a file, the validity of its extension, and the existence of a directory. + +Function | Code +:- | :--- +`chk_file(x)` | `vld_string(x) && file.exists(x) && !dir.exists(x)` +`chk_ext(x, ext)` | `vld_string(x) && vld_subset(tools::file_ext(x), ext)` +`chk_dir(x)` | `vld_string(x) && dir.exists(x)` + +### NULL checker +Check if the function input is NULL or not + +Function | Code +:- | :--- +`chk_null(x)` | `is.null(x)` +`chk_not_null(x)` | `!is.null(x)` + +### Scalar Checkers +Check if the function input is a scalar. +In R, scalars are vectors of length 1. + +Function | Code +:- | :------ +`chk_scalar(x)` | `length(x) == 1L` + +The following functions check if the functions inputs are vectors of length 1 of a particular data type. +Each data type has a special syntax to create an individual value or "scalar". + +Function | Code +:- | :------ +`chk_string(x)` | `is.character(x) && length(x) == 1L && !anyNA(x)` +`chk_number(x)` | `is.numeric(x) && length(x) == 1L && !anyNA(x)` + +For logical data types, you can check flags using `chk_flag()`, which considers `TRUE` or `FALSE` as possible values, or use `chk_lgl()` to verify if a scalar is of type logical, including NA as element. + +Function | Code +:- | :- +`chk_flag(x)` | `is.logical(x) && length(x) == 1L && !anyNA(x)` +`chk_lgl(x)` | `is.logical(x) && length(x) == 1L` + +It is also possible to check if the user-provided argument is only `TRUE` or only `FALSE`: + +Function | Code +:- | :- +`chk_true(x)` | `is.logical(x) && length(x) == 1L && !anyNA(x) && x` +`chk_false(x)` | `is.logical(x) && length(x) == 1L && !anyNA(x) && !x` + +### Date or DateTime Checkers +Check if the function input is of class Date or DateTime + +Date and datetime classes can be checked with `chk_date` and `chk_datetime`. + +Function | Code +:- | :------ +`chk_date(x)` | `inherits(x, "Date") && length(x) == 1L && !anyNA(x)` +`chk_date_time(x)` | `inherits(x, "POSIXct") && length(x) == 1L && !anyNA(x)` + +### Time Zone Checker +Also you can check the time zone with `chk_tz()`. +The available time zones can be retrieved using the function `OlsonNames()`. + +Function | Code +:- | :------ +`chk_tz(x)` | `is.character(x) && length(x) == 1L && !anyNA(x) && x %in% OlsonNames()` + +#### Data Structure Checker +Check if the function input has a specific data structure. + +Vectors are a family of data types that come in two forms: atomic vectors and lists. +When vectors consist of elements of the same data type, they can be considered atomic, matrices, or arrays. +The elements in a list, however, can be of different types. + +To check if a function argument is a vector you can use `chk_vector()`. + +Function | Code +:- | :--- +`chk_vector(x)` | `is.atomic(x) && !is.matrix(x) && !is.array(x)) || is.list(x)` + +Pay attention that `chk_vector()` and `vld_vector()` +are different from `is.vector()`, that will return FALSE if the vector has any attributes except names. + +```{r} +vector <- c(1, 2, 3) +is.vector(vector) # TRUE +vld_vector(vector) # TRUE + +attributes(vector) <- list("a" = 10, "b" = 20, "c" = 30) +is.vector(vector) # FALSE +vld_vector(vector) # TRUE +``` +Function | Code +:- | :--- +`chk_atomic(x)` | `is.atomic(x)` + +Notice that `is.atomic` is true for the types logical, integer, numeric, complex, character and raw. Also, it is TRUE for NULL. + +```{r} +vector <- c(1, 2, 3) +is.atomic(vector) # TRUE +vld_vector(vector) # TRUE + +is.atomic(NULL) # TRUE +vld_vector(NULL) # TRUE +``` + +The dimension attribute converts vectors into matrices and arrays. + +Function | Code +:- | :--- +`chk_array(x)` | `is.array(x)` +`chk_matrix(x)` | `is.matrix(x)` + +When a vector is composed by heterogeneous data types, can be a list. +Data frames are among the most important S3 vectors, constructed on top of lists. + +Function | Code +:- | :--- +`chk_list(x)` | `is.list()` +`chk_data(x)` | `inherits(x, "data.frame")` + +Be careful not to confuse the function `chk_data` with `check_data`. +Please read the `check_` functions section below and the function documentation. + +### Data Type Checkers +Check if the function input has a data type. +You can use the function `typeof()` to confirm the data type. + +Function | Code +:- | :--- +`chk_environment(x)` | `is.environment(x)` +`chk_logical(x)` | `is.logical(x)` +`chk_character(x)` | `is.character(x)` + +For numbers there are four functions. +R differentiates between doubles (`chk_double()`) and integers (`chk_integer()`). +You can also use the generic function `chk_numeric()`, which will detect both. +The third type of number is complex (`chk_complex()`). + +Function | Code +:- | :--- +`chk_numeric(x)` | `is.numeric(x)` +`chk_double(x)` | `is.double(x)` +`chk_integer(x)` | `is.integer(x)` +`chk_complex(x)` | `is.complex(x)` + +Consider that to explicitly create an integer in R, you need to use the suffix `L`. + +```{r} +vld_numeric(33) # TRUE + +vld_double(33) # TRUE +vld_integer(33) # FALSE + +vld_integer(33L) # TRUE +``` + + +### Whole Number Checkers +These functions accept whole numbers, whether they are explicitly integers or double types without fractional parts. + +Function | Code +:- | :--- +`chk_whole_numeric` | `is.integer(x) || (is.double(x) && vld_true(all.equal(x[!is.na(x)], trunc(x[!is.na(x)]))))` +`chk_whole_number` | `vld_number(x) && (is.integer(x) || vld_true(all.equal(x, trunc(x))))` +`chk_count` | `vld_whole_number(x) && x >= 0` + +If you want to consider both 3.0 and 3L as integers, it is safer to use the function `chk_whole_numeric`. +Here, `x` is valid if it's an integer or a double that can be converted to an integer without changing its value. + +```{r} +# Integer vector +vld_whole_numeric(c(1L, 2L, 3L)) # TRUE + +# Double vector representing whole numbers +vld_whole_numeric(c(1.0, 2.0, 3.0)) # TRUE + +# Double vector with fractional numbers +vld_whole_numeric(c(1.0, 2.2, 3.0)) # FALSE +``` + +The function `chk_whole_number` is similar to `chk_whole_numeric`. +`chk_whole_number` checks if the number is of `length(x) == 1L` + +```{r} +# Integer vector +vld_whole_numeric(c(1L, 2L, 3L)) # TRUE +vld_whole_number(c(1L, 2L, 3L)) # FALSE +vld_whole_number(c(1L)) # TRUE +``` + +`chk_count()` is a special case of `chk_whole_number`, differing in that it ensures values are non-negative whole numbers. + +```{r} +# Positive integer +vld_count(1) #TRUE +# Zero +vld_count(0) # TRUE +# Negative number +vld_count(-1) # FALSE +# Non-whole number +vld_count(2.5) # FALSE +``` + +### Factor Checker +Check if the function input is a factor + +Function | Code +:- | :------ +`chk_factor` | `is.factor(x)` +`chk_character_or_factor` | `is.character(x) || is.factor(x)` + +Factors can be specially confusing for users, because despite they are displayed as characters are built in top of integer vectors. + +`chk` provides the function `chk_character_or_factor()` that allows detecting if the argument that the user is providing contains strings. + +```{r} +# Factor with specified levels + +vector_fruits <- c("apple", "banana", "apple", "orange", "banana", "apple") + +factor_fruits <- factor(c("apple", "banana", "apple", "orange", "banana", "apple"), + levels = c("apple", "banana", "orange")) + + +is.factor(factor_fruits) # TRUE +vld_factor(factor_fruits) # TRUE + +is.character(factor_fruits) # FALSE +vld_character(factor_fruits) # FALSE + +vld_character_or_factor(factor_fruits) # TRUE + +``` + + +### All Elements Checkers +Check if the function input has a characteristic shared by all its elements. + +If you want to apply any of the previously defined functions for `length(x) == 1L` to the elements of a vector, you can use `chk_all()`. + +Function | Code +:- | :--- +`chk_all(x, chk_fun, ...)` | `all(vapply(x, chk_fun, TRUE, ...))` + +```{r} +vld_all(c(TRUE, TRUE, FALSE), chk_lgl) # FALSE +``` + +### Function Checker +Check if the function input is another function + +`formals` refers to the count of the number of formal arguments + +Function | Code +:- | :------ +`chk_function` | `is.function(x) && (is.null(formals) || length(formals(x)) == formals)` + +```{r} +vld_function(function(x) x, formals = 1) # TRUE +vld_function(function(x, y) x + y, formals = 1) # FALSE +vld_function(function(x, y) x + y, formals = 2) # TRUE +``` + +### Name Checkers +Check if the function input has names and are valid `chk_named` function works with vectors, lists, data frames, and matrices that have named columns or rows. +Do not confuse with `check_names`. + +`chk_valid_name` function specifically designed to check if the elements of a character vector are valid R names. +If you want to know what is considered a valid name, +please refer to the documentation for the `make.names` function. + +Function | Code +:- | :-- +`chk_named(x)` | `!is.null(names(x))` +`chk_valid_name(x)` | `identical(make.names(x[!is.na(x)]), as.character(x[!is.na(x)]))` + +```{r} + +vld_valid_name(c("name1", NA, "name_2", "validName")) # TRUE +vld_valid_name(c(1, 2, 3)) # FALSE + + +vld_named(data.frame(a = 1:5, b = 6:10)) # TRUE +vld_named(list(a = 1, b = 2)) # TRUE +vld_named(c(a = 1, b = 2)) # TRUE +vld_named(c(1, 2, 3)) # FALSE + +``` + +### Range Checkers +Check if the function input is part of a range of values. +The function input should be numeric. + +Function | Code +:- | :--- +`chk_range(x, range = c(0, 1))` | `all(x[!is.na(x)] >= range[1] & x[!is.na(x)] <= range[2])` +`chk_lt(x, value = 0)` | `all(x[!is.na(x)] < value)` +`chk_lte(x, value = 0)` | `all(x[!is.na(x)] <= value)` +`chk_gt(x, value = 0)` | `all(x[!is.na(x)] > value)` +`chk_gte(x, value = 0)` | `all(x[!is.na(x)] >= value)` + +### Equal Checkers +Check if the function input is equal or similar to a predefined object. + +The functions `chk_identical()`, `chk_equal()`, and `chk_equivalent()` are used to compare two objects, but they differ in how strict the comparison is. + +`chk_equal` and `chk_equivalent`checks if x and y are numerically equivalent within a specified tolerance, but `chk_equivalent` ignores differences in attributes. + +Function | Code +:-- | :- +`chk_identical(x, y)` | `identical(x, y)` +`chk_equal(x, y, tolerance = sqrt(.Machine$double.eps))` | `vld_true(all.equal(x, y, tolerance))` +`chk_equivalent(x, y, tolerance = sqrt(.Machine$double.eps))` | `vld_true(all.equal(x, y, tolerance, check.attributes = FALSE))` + +In the case you want to compare the elements of a vector, you can use the `check_all_*` functions. + +Function | Code +:-- | :-- +`chk_all_identical(x)` | `length(x) < 2L || all(vapply(x, vld_identical, TRUE, y = x[[1]]))` +`chk_all_equal(x, tolerance = sqrt(.Machine$double.eps))` | `length(x) < 2L || all(vapply(x, vld_equal, TRUE, y = x[[1]], tolerance = tolerance))` +`chk_all_equivalent(x, tolerance = sqrt(.Machine$double.eps))` | `length(x) < 2L || all(vapply(x, vld_equivalent, TRUE, y = x[[1]], tolerance = tolerance))` + +```{r} +vld_all_identical(c(1, 2, 3)) # FALSE +vld_all_identical(c(1, 1, 1)) # TRUE +vld_identical(c(1, 2, 3), c(1, 2, 3)) # TRUE + +vld_all_equal(c(0.1, 0.12, 0.13)) +vld_all_equal(c(0.1, 0.12, 0.13), tolerance = 0.2) +vld_equal(c(0.1, 0.12, 0.13), c(0.1, 0.12, 0.13)) # TRUE +vld_equal(c(0.1, 0.12, 0.13), c(0.1, 0.12, 0.4), tolerance = 0.5) # TRUE + +x <- c(0.1, 0.1, 0.1) +y <- c(0.1, 0.12, 0.13) +attr(y, "label") <- "Numbers" +vld_equal(x, y, tolerance = 0.5) # FALSE +vld_equivalent(x, y, tolerance = 0.5) # TRUE +``` + +### Order Checker +Check if the function input are numbers in increasing order +`chk_sorted` function checks if `x` is sorted in non-decreasing order, ignoring any NA values. + +Function | Code +:- | :-- +`chk_sorted(x)` | `!is.unsorted(x, na.rm = TRUE)` + +```{r} +# Checking if sorted +vld_sorted(c(1, 2, 3, NA, 4)) # TRUE +vld_sorted(c(3, 1, 2, NA, 4)) # FALSE +``` + +### Set Checkers +Check if the function input is composed by certain elements + +The `setequal` function in R is used to check if two vectors contain exactly the same elements, regardless of the order or number of repetitions. + +Function | Code +:- | :--- +`chk_setequal(x, values)` | `setequal(x, values)` + +```{r} +vld_setequal(c(1, 2, 3), c(3, 2, 1)) # TRUE +vld_setequal(c(1, 2, 3), c(3, 2, 1, 4)) # FALSE +vld_setequal(c(1, 2, 3, 4), c(3, 2, 1)) # FALSE +vld_setequal(c(1, 2), c(1, 1, 1, 1, 1, 1, 2, 1)) # TRUE +``` + +First, the `%in%` function is used to check whether +the elements of a vector `x` are present in a specified set of values. +This returns a logical vector, which is then simplified by `all()`. The `all()` function checks if all values in the vector are TRUE. +If the result is TRUE, it indicates that for `vld_` and `chk_subset()`, all elements in the `x` vector are present in `values`. +Similarly, for `vld_` and `chk_superset()`, it indicates that all elements of `values` are present in `x`. + +Function | Code +:-- | :-- +`chk_subset(x, values)` | `all(x %in% values)` +`chk_not_subset(x, values)` | `!any(x %in% values) || !length(x)` +`chk_superset(x, values)` | `all(values %in% x)` + +```{r} + +# When both function inputs have the same elements, +# all functions return TRUE + +vld_setequal(c(1, 2, 3), c(3, 2, 1)) # TRUE +vld_subset(c(1, 2, 3), c(3, 2, 1)) # TRUE +vld_superset(c(1, 2, 3), c(3, 2, 1)) # TRUE + +vld_setequal(c(1, 2), c(1, 1, 1, 1, 1, 1, 2, 1)) # TRUE +vld_subset(c(1, 2), c(1, 1, 1, 1, 1, 1, 2, 1)) # TRUE +vld_superset(c(1, 2), c(1, 1, 1, 1, 1, 1, 2, 1)) # TRUE + +# When there are elements present in one vector but not the other, +# `vld_setequal()` will return FALSE + +vld_setequal(c(1, 2, 3), c(3, 2, 1, 4)) # FALSE +vld_setequal(c(1, 2, 3, 4), c(3, 2, 1)) # FALSE + +# When some elements of the `x` input are not present in `values`, +# `vld_subset()` returns FALSE +vld_subset(c(1, 2, 3, 4), c(3, 2, 1)) # FALSE +vld_superset(c(1, 2, 3, 4), c(3, 2, 1)) # TRUE + +# When some elements of the `values` input are not present in `x`, +# `vld_superset()` returns FALSE + +vld_subset(c(1, 2, 3), c(3, 2, 1, 4)) # TRUE +vld_superset(c(1, 2, 3), c(3, 2, 1, 4)) # FALSE + +# An empty set is considered a subset of any set, and any set is a superset of an empty set. +vld_subset(c(), c("apple", "banana")) # TRUE +vld_superset(c("apple", "banana"), c()) # TRUE +``` + +`chk_orderset()` validate whether a given set of `values` in a vector x matches a specified set of allowed `values` (represented by `values`) while preserving the order of those values. + +Function | Code +:-- | :-- +`chk_orderset` | `vld_equivalent(unique(x[x %in% values]), values[values %in% x])` + +```{r} +vld_orderset(c("A", "B", "C"), c("A", "B", "C", "D")) # TRUE +vld_orderset(c("C", "B", "A"), c("A", "B", "C", "D")) # FALSE +vld_orderset(c("A", "C"), c("A", "B", "C", "D")) # TRUE +``` + + +### Class Checkers +Check if the function input belongs to a class or type. + +These functions check if `x` is an S3 or S4 object of the specified class. + +Function | Code +:- | :--- +`chk_s3_class(x, class)` | `!isS4(x) && inherits(x, class)` +`chk_s4_class(x, class)` | `isS4(x) && methods::is(x, class)` + +`chk_is()` checks if x inherits from a specified class, regardless of whether it is an S3 or S4 object. + +Function | Code +:- | :--- +`chk_is(x, class)` | `inherits(x, class)` + +### REGEX Checker +Check if the function input matches a regular expression (REGEX). + +`chk_match(x, regexp = ".+")` checks if the regular expression pattern specified by `regexp` matches all the non-missing values in the vector `x`. +If `regexp` it is not specified by the user, `chk_match` checks whether all non-missing values in `x` contain at least one character (regexp = ".+") + +Function | Code +:- | :-- +`chk_match(x, regexp = ".+")` | `all(grepl(regexp, x[!is.na(x)]))` + +### Quality Checkers (Miscellaneous) +Check if the function input meet some user defined quality criteria. + +`chk_not_empty` function checks if the length of the object is not zero. +For a data frame or matrix, the length corresponds to the number of elements (not rows or columns), +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. + +Function | Code +:- | :-- +`chk_not_empty(x)` | `length(x) != 0L` +`chk_not_any_na(x)` | `!anyNA(x)` + +```{r} +vld_not_empty(c()) # FALSE +vld_not_empty(list()) # FALSE +vld_not_empty(data.frame()) # FALSE +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 +``` +The `chk_unique()` function is designed to verify that there are no duplicates elements in a vector. + +Function | Code +:- | :-- +`chk_unique(x, incomparables = FALSE)` | `!anyDuplicated(x, incomparables = incomparables)` + +```{r} +vld_unique(c(1, 2, 3, 4)) # TRUE +vld_unique(c(1, 2, 2, 4)) # FALSE +``` + +The function `chk_length` checks whether the length of `x` is within a specified range. +It ensures that the length is at least equal to `length` and no more than `upper`. +It can be used with vectors, lists and data frames. + +Function | Code +:- | :-- +`chk_length(x, length = 1L, upper = length)` | `length(x) >= length && length(x) <= upper` + +```{r} +vld_length(c(1, 2, 3), length = 2, upper = 5) # TRUE +vld_length(c("a", "b"), length = 3) # FALSE + +vld_length(list(a = 1, b = 2, c = 3), length = 2, upper = 4) # TRUE +vld_length(list(a = 1, b = 2, c = 3), length = 4) # FALSE + +# 2 columns +vld_length(data.frame(x = 1:3, y = 4:6), length = 1, upper = 3) # TRUE +vld_length(data.frame(x = 1:3, y = 4:6), length = 3) # FALSE + +# length of NULL is 0 +vld_length(NULL, length = 0) # TRUE +vld_length(NULL, length = 1) # FALSE +``` + + +Another useful function is `chk_compatible_lenghts()`. +This function helps to check vectors could be 'strictly recycled'. + +```{r} +a <- integer(0) +b <- numeric(0) +vld_compatible_lengths(a, b) # TRUE + +a <- 1 +b <- 2 +vld_compatible_lengths(a, b) # TRUE + +a <- 1:3 +b <- 1:3 +vld_compatible_lengths(a, b) # TRUE + +b <- 1 +vld_compatible_lengths(a, b) # TRUE + +b <- 1:2 +vld_compatible_lengths(a, b) # FALSE + +b <- 1:6 +vld_compatible_lengths(a, b) # FALSE +``` + +The `chk_join()` function is designed to validate whether the number of rows in the resulting data frame from merging two data frames (`x` and `y`) is equal to the number of rows in the first data frame (`x`). +This is useful when you want to ensure that a join operation does not change the number of rows in your main data frame. + +Function | Code +:- | :-- +`chk_join(x, y, by)` | `identical(nrow(x), nrow(merge(x, unique(y[if (is.null(names(by))) by else names(by)]), by = by)))` + +```{r} +x <- data.frame(id = c(1, 2, 3), value_x = c("A", "B", "C")) +y <- data.frame(id = c(1, 2, 3), value_y = c("D", "E", "F")) +vld_join(x, y, by = "id") # TRUE + +# Perform a join that reduces the number of rows +y <- data.frame(id = c(1, 2, 1), value_y = c("D", "E", "F")) +vld_join(x, y, by = "id") # FALSE +``` + + +## `check_` functions + +The `check_` functions combine several `chk_` functions internally. +Read the documentation for each function to learn more about its specific use. + +Function | Description +:- | :-- +`check_values(x, values)` | Checks values and S3 class of an atomic object. +`check_key(x, key = character(0), na_distinct = FALSE)` | Checks if columns have unique rows. +`check_data(x, values, exclusive, order, nrow, key)` | Checks column names, values, number of rows and key for a data.frame. +`check_dim(x, dim, values, dim_name)` | Checks dimension of an object. +`check_dirs(x, exists)` | Checks if all directories exist (or if exists = FALSE do not exist as directories or files). +`check_files(x, exists)` | Checks if all files exist (or if exists = FALSE do not exist as files or directories). +`check_names(x, names, exclusive, order)` | Checks the names of an object. + +## References + +Wickham, H. (2019). Advanced R, Second Edition (2nd ed.). Chapman and Hall/CRC. diff --git a/chk.Rcheck/00_pkg_src/chk/inst/doc/chk.R b/chk.Rcheck/00_pkg_src/chk/inst/doc/chk.R new file mode 100644 index 00000000..e097ddc1 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/inst/doc/chk.R @@ -0,0 +1,50 @@ +## ----include = FALSE---------------------------------------------------------- +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#>" +) + +## ----error=TRUE--------------------------------------------------------------- +try({ +library(chk) +y <- TRUE +chk_flag(y) +y <- NA +chk_flag(y) +}) + +## ----error=TRUE--------------------------------------------------------------- +try({ +vld_flag(TRUE) +vld_flag(NA) +}) + +## ----error=TRUE--------------------------------------------------------------- +try({ +if (!vld_flag(NA)) abort_chk("`NA` is not TRUE or FALSE!!") +}) + +## ----error = TRUE------------------------------------------------------------- +try({ +fun1 <- function(x) { + chk_whole_number(x) + # use x +} + +fun1(1) +y <- 1.3 +fun1(x = y) +}) + +## ----error = TRUE------------------------------------------------------------- +try({ +x <- NA +chk_flag(x, x_name = "`zzz`") +}) + +## ----error=TRUE--------------------------------------------------------------- +try({ +abort_chk("There %r %n problem director%y%s.", n = 1) +abort_chk("there %r %n ", "problem director%y%s", n = 2) +}) + diff --git a/chk.Rcheck/00_pkg_src/chk/inst/doc/chk.Rmd b/chk.Rcheck/00_pkg_src/chk/inst/doc/chk.Rmd new file mode 100644 index 00000000..99270112 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/inst/doc/chk.Rmd @@ -0,0 +1,142 @@ +--- +title: "Get Started with chk" +output: rmarkdown::html_vignette +vignette: > + %\VignetteIndexEntry{Get Started with chk} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + +```{r, include = FALSE} +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#>" +) +``` + +## Introduction + +R functions and packages are great for sharing code, but it's hard to predict how end-users will implement them. +Users might pass inputs that your function wasn't designed to handle, leading to incorrect results or errors. +For example, if a function expects a numeric vector (e.g., `c(1, 2, 3)`) but receives a character vector (e.g.,` c("1", "2", "3")`), it may return an error. + +The `chk` package provides a set of functions that check user-provided arguments and deliver meaningful error messages to guide users when something goes wrong. +Including `chk`'s specially designed functions when developing your R package will help improve user experience, prevent errors, and make your code more robust by ensuring consistent behavior across different inputs. +This enhances the reliability and reusability of your code. + +Additionally, it can help with performance optimization by ensuring that your functions receive inputs of the appropriate size, thereby avoiding time-consuming calculations. + +## Goal + +`chk` is an R package for developers +to check user-supplied function arguments. + +It is designed to be simple, customizable and fast. + +## `chk` Functions + +Based on the function prefixes, we can classify `chk` functions into three categories: + +1. `chk_` Functions +2. `vld_` Functions +3. `check_` Functions + +### 1. `chk_` Functions + +`chk_` functions check the properties of individual objects. +For example, +`chk_flag(x)` checks whether `x` is a flag, i.e., a non-missing logical vector of length 1. + +`chk_` functions are called for their side-effects, +i.e., they throw an informative error if the object fails the check. +Although do return an invisible copy of the first argument so they can be used in pipes. + +```{r, error=TRUE} +library(chk) +y <- TRUE +chk_flag(y) +y <- NA +chk_flag(y) +``` + +The error messages, which follow the [tidyverse style guide](https://style.tidyverse.org/errors.html), are designed to allow the user to quickly identify the problem with the argument value(s) they are providing. +The errors are [rlang errors](https://rlang.r-lib.org/reference/abort.html) of subclass `'chk_error'`. + +### 2. `vld_` Functions + +Each `chk_` function has a matching `vld_` function +which returns a flag indicating whether the object passed the check. +```{r, error=TRUE} +vld_flag(TRUE) +vld_flag(NA) +``` +The `vld_` functions allow developers to provide their own error messages. +```{r, error=TRUE} +if (!vld_flag(NA)) abort_chk("`NA` is not TRUE or FALSE!!") +``` + +### 3. `check_` Functions + +The `check_` functions are more complex then the `chk_` functions which make them slower but +makes doing some general tests easier. + +## Using chk + +The `chk_` functions are designed to be used within functions. +Consequently, when constructing an error message they use the name of the object that they received +as this is expected to be the name of the argument. +```{r, error = TRUE} +fun1 <- function(x) { + chk_whole_number(x) + # use x +} + +fun1(1) +y <- 1.3 +fun1(x = y) +``` + +If this is not the case, developers can provide a different name using the `x_name` argument. +```{r, error = TRUE} +x <- NA +chk_flag(x, x_name = "`zzz`") +``` + +**IMPORTANT NOTE** + +As the `chk_` (and `vld_`) functions are not expected to be directly exposed to users they don't check any of their arguments (other than the object of interest of course!) to ensure that they are as fast as possible. + + +## Extending chk + +The `chk_flag()` function illustrates the general structure of a `chk_` function. + +``` r +chk_flag +#> function(x, x_name = NULL){ +#> if(vld_flag(x)) return(invisible(x)) +#> if(is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) +#> abort_chk(x_name, " must be a flag (TRUE or FALSE)") +#> } +#> +#> +``` + +A `chk_` function initially checks the object (using its `vld_` partner) and if the object passes the check immediately returns an invisible copy of the object. +If, and only if, the object fails the check does the `chk_` function construct and then throw an informative error message. + +The `deparse_backtick_chk()` and `abort_chk()` functions are exported to make it easy for programmers to develop their own `chk_` functions. +The [chk-lgl.R](https://github.com/poissonconsulting/chk/blob/master/R/chk-lgl.R) script illustrates +the general template to use when developing your own `chk_` functions. + +### `abort_chk()` + +The `abort_chk()` function converts multiple arguments to a string using `paste0(..., collapse = '')` and provides number sensitive `sprintf`-like types. +By default it also capitalizes the first character +and adds a missing period. +```{r, error=TRUE} +abort_chk("There %r %n problem director%y%s.", n = 1) +abort_chk("there %r %n ", "problem director%y%s", n = 2) +``` + + diff --git a/chk.Rcheck/00_pkg_src/chk/man/aaa.Rd b/chk.Rcheck/00_pkg_src/chk/man/aaa.Rd new file mode 100644 index 00000000..d24edfd1 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/aaa.Rd @@ -0,0 +1,15 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/aaa.R +\name{aaa} +\alias{aaa} +\title{Workaround: Avoid backtraces in examples} +\description{ +This example will run first and set the option for the process that builds +the example. +(By default, pkgdown builds in a separate process.) +This also produces a help page that isn't linked from anywhere. +} +\examples{ +options(rlang_backtrace_on_error = "none") +} +\keyword{internal} diff --git a/chk.Rcheck/00_pkg_src/chk/man/abort_chk.Rd b/chk.Rcheck/00_pkg_src/chk/man/abort_chk.Rd new file mode 100644 index 00000000..613ab6ec --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/abort_chk.Rd @@ -0,0 +1,48 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils.R +\name{abort_chk} +\alias{abort_chk} +\title{Abort Check} +\usage{ +abort_chk(..., n = NULL, tidy = TRUE, call = rlang::caller_call(2)) +} +\arguments{ +\item{...}{Multiple objects that are converted to a string using +\code{paste0(..., collapse = '')}.} + +\item{n}{The value of n for converting \code{sprintf}-like types.} + +\item{tidy}{A flag specifying whether capitalize the first character and add a missing period.} + +\item{call}{The execution environment of a currently running +function, e.g. \code{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 \code{call} when throwing a condition from a +helper function which wouldn't be relevant to mention in the +message. + +Can also be \code{NULL} or a \link[rlang:topic-defuse]{defused function call} to +respectively not display any call or hard-code a code to display. + +For more information about error calls, see \ifelse{html}{\link[rlang:topic-error-call]{Including function calls in error messages}}{\link[rlang:topic-error-call]{Including function calls in error messages}}.} +} +\value{ +Throws an error of class \code{'chk_error'}. +} +\description{ +A wrapper on \code{\link[=err]{err()}} that sets the subclass to be \code{'chk_error'}. +} +\details{ +It is exported to allow users to easily construct their own \code{chk_} functions. +} +\examples{ +try(abort_chk("x must be NULL")) +try(abort_chk("`x` must be NULL")) +try(abort_chk("there \%r \%n problem value\%s", n = 1)) +try(abort_chk("there \%r \%n problem value\%s", n = 1.5)) +} +\seealso{ +\code{\link[=err]{err()}} +} diff --git a/chk.Rcheck/00_pkg_src/chk/man/cc.Rd b/chk.Rcheck/00_pkg_src/chk/man/cc.Rd new file mode 100644 index 00000000..abeae8d7 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/cc.Rd @@ -0,0 +1,47 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/cc.R +\name{cc} +\alias{cc} +\title{Concatenate with Commas} +\usage{ +cc( + x, + conj = ", ", + sep = ", ", + brac = if (is.character(x) || is.factor(x)) "'" else "", + ellipsis = 10L, + chk = TRUE +) +} +\arguments{ +\item{x}{The object to concatenate.} + +\item{conj}{A string of the conjunction to separate the last value by.} + +\item{sep}{A string of the separator.} + +\item{brac}{A string to brac the values by.} + +\item{ellipsis}{A numeric scalar of the maximum number of values to display +before using an ellipsis.} + +\item{chk}{A flag specifying whether to check the other parameters.} +} +\value{ +A string. +} +\description{ +Concatenates object values into a string with each value separated by a comma +and the last value separated by a conjunction. +} +\details{ +By default, if x has more than 10 values an ellipsis is used +to ensure only 10 values are displayed (including the ellipsis). +} +\examples{ +cc(1:2) +cc(1:2, conj = " or") +cc(3:1, brac = "'") +cc(1:11) +cc(as.character(1:2)) +} diff --git a/chk.Rcheck/00_pkg_src/chk/man/check_data.Rd b/chk.Rcheck/00_pkg_src/chk/man/check_data.Rd new file mode 100644 index 00000000..6fc99001 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/check_data.Rd @@ -0,0 +1,55 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/check-data.R +\name{check_data} +\alias{check_data} +\title{Check Data} +\usage{ +check_data( + x, + values = NULL, + exclusive = FALSE, + order = FALSE, + nrow = numeric(0), + key = character(0), + x_name = NULL +) +} +\arguments{ +\item{x}{The object to check.} + +\item{values}{A uniquely named list of atomic vectors of the column values.} + +\item{exclusive}{A flag specifying whether x must only include columns named in values.} + +\item{order}{A flag specifying whether the order of columns in x must match names in values.} + +\item{nrow}{A flag or a whole numeric vector of the value, value range or possible values.} + +\item{key}{A character vector of the columns that represent a unique key.} + +\item{x_name}{A string of the name of object x or NULL.} +} +\value{ +An informative error if the test fails or an invisible copy of x. +} +\description{ +Checks column names, values, number of rows and key for a data.frame. +} +\examples{ +check_data(data.frame()) +check_data(data.frame(x = 2), list(x = 1)) +try(check_data(data.frame(x = 2), list(y = 1L))) +try(check_data(data.frame(x = 2), list(y = 1))) +try(check_data(data.frame(x = 2), nrow = 2)) +} +\seealso{ +Other check: +\code{\link{check_dim}()}, +\code{\link{check_dirs}()}, +\code{\link{check_files}()}, +\code{\link{check_key}()}, +\code{\link{check_length}()}, +\code{\link{check_names}()}, +\code{\link{check_values}()} +} +\concept{check} diff --git a/chk.Rcheck/00_pkg_src/chk/man/check_dim.Rd b/chk.Rcheck/00_pkg_src/chk/man/check_dim.Rd new file mode 100644 index 00000000..1a7fafe9 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/check_dim.Rd @@ -0,0 +1,42 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/check-dim.R +\name{check_dim} +\alias{check_dim} +\title{Check Dimension} +\usage{ +check_dim(x, dim = length, values = numeric(0), x_name = NULL, dim_name = NULL) +} +\arguments{ +\item{x}{The object to check.} + +\item{dim}{A function returning a non-negative whole number of the dimension.} + +\item{values}{A flag or a whole numeric vector of the value, value range or possible values.} + +\item{x_name}{A string of the name of object x or NULL.} + +\item{dim_name}{A string of the name of the dim function.} +} +\value{ +An informative error if the test fails or an invisible copy of x. +} +\description{ +Checks dimension of an object. +} +\examples{ +check_dim(1) +try(check_dim(1, values = FALSE)) +try(check_dim(1, values = c(10, 2))) +try(check_dim(data.frame(x = 1), dim = nrow, values = c(10, 10, 2))) +} +\seealso{ +Other check: +\code{\link{check_data}()}, +\code{\link{check_dirs}()}, +\code{\link{check_files}()}, +\code{\link{check_key}()}, +\code{\link{check_length}()}, +\code{\link{check_names}()}, +\code{\link{check_values}()} +} +\concept{check} diff --git a/chk.Rcheck/00_pkg_src/chk/man/check_dirs.Rd b/chk.Rcheck/00_pkg_src/chk/man/check_dirs.Rd new file mode 100644 index 00000000..1f7c7d02 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/check_dirs.Rd @@ -0,0 +1,36 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/check-dirs.R +\name{check_dirs} +\alias{check_dirs} +\title{Check Directories Exist} +\usage{ +check_dirs(x, exists = TRUE, x_name = NULL) +} +\arguments{ +\item{x}{The object to check.} + +\item{exists}{A flag specifying whether the files/directories must (or must not) exist.} + +\item{x_name}{A string of the name of object x or NULL.} +} +\value{ +An informative error if the test fails or an invisible copy of x. +} +\description{ +Checks if all directories exist (or if exists = FALSE do not exist as directories or files). +} +\examples{ +check_dirs(tempdir()) +try(check_dirs(tempdir(), exists = FALSE)) +} +\seealso{ +Other check: +\code{\link{check_data}()}, +\code{\link{check_dim}()}, +\code{\link{check_files}()}, +\code{\link{check_key}()}, +\code{\link{check_length}()}, +\code{\link{check_names}()}, +\code{\link{check_values}()} +} +\concept{check} diff --git a/chk.Rcheck/00_pkg_src/chk/man/check_files.Rd b/chk.Rcheck/00_pkg_src/chk/man/check_files.Rd new file mode 100644 index 00000000..e6409f34 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/check_files.Rd @@ -0,0 +1,36 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/check-files.R +\name{check_files} +\alias{check_files} +\title{Check Files Exist} +\usage{ +check_files(x, exists = TRUE, x_name = NULL) +} +\arguments{ +\item{x}{The object to check.} + +\item{exists}{A flag specifying whether the files/directories must (or must not) exist.} + +\item{x_name}{A string of the name of object x or NULL.} +} +\value{ +An informative error if the test fails or an invisible copy of x. +} +\description{ +Checks if all files exist (or if exists = FALSE do not exist as files or directories). +} +\examples{ +check_files(tempfile("unlikely-that-exists-chk"), exists = FALSE) +try(check_files(tempfile("unlikely-that-exists-chk"))) +} +\seealso{ +Other check: +\code{\link{check_data}()}, +\code{\link{check_dim}()}, +\code{\link{check_dirs}()}, +\code{\link{check_key}()}, +\code{\link{check_length}()}, +\code{\link{check_names}()}, +\code{\link{check_values}()} +} +\concept{check} diff --git a/chk.Rcheck/00_pkg_src/chk/man/check_key.Rd b/chk.Rcheck/00_pkg_src/chk/man/check_key.Rd new file mode 100644 index 00000000..dd5ecafb --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/check_key.Rd @@ -0,0 +1,39 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/check-key.R +\name{check_key} +\alias{check_key} +\title{Check Key} +\usage{ +check_key(x, key = character(0), na_distinct = FALSE, x_name = NULL) +} +\arguments{ +\item{x}{The object to check.} + +\item{key}{A character vector of the columns that represent a unique key.} + +\item{na_distinct}{A flag specifying whether missing values should be considered distinct.} + +\item{x_name}{A string of the name of object x or NULL.} +} +\value{ +An informative error if the test fails or an invisible copy of x. +} +\description{ +Checks if columns have unique rows. +} +\examples{ +x <- data.frame(x = c(1, 2), y = c(1, 1)) +check_key(x) +try(check_key(x, "y")) +} +\seealso{ +Other check: +\code{\link{check_data}()}, +\code{\link{check_dim}()}, +\code{\link{check_dirs}()}, +\code{\link{check_files}()}, +\code{\link{check_length}()}, +\code{\link{check_names}()}, +\code{\link{check_values}()} +} +\concept{check} diff --git a/chk.Rcheck/00_pkg_src/chk/man/check_length.Rd b/chk.Rcheck/00_pkg_src/chk/man/check_length.Rd new file mode 100644 index 00000000..ecbd1985 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/check_length.Rd @@ -0,0 +1,37 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/check-length.R +\name{check_length} +\alias{check_length} +\title{Check Length} +\usage{ +check_length(x, values = numeric(0), x_name = NULL) +} +\arguments{ +\item{x}{The object to check.} + +\item{values}{A flag or a whole numeric vector of the value, value range or possible values.} + +\item{x_name}{A string of the name of object x or NULL.} +} +\value{ +An informative error if the test fails or an invisible copy of x. +} +\description{ +Checks length of an object. +} +\examples{ +check_length(1) +try(check_length(1, values = FALSE)) +try(check_length(1, values = c(10, 2))) +} +\seealso{ +Other check: +\code{\link{check_data}()}, +\code{\link{check_dim}()}, +\code{\link{check_dirs}()}, +\code{\link{check_files}()}, +\code{\link{check_key}()}, +\code{\link{check_names}()}, +\code{\link{check_values}()} +} +\concept{check} diff --git a/chk.Rcheck/00_pkg_src/chk/man/check_names.Rd b/chk.Rcheck/00_pkg_src/chk/man/check_names.Rd new file mode 100644 index 00000000..b6719f43 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/check_names.Rd @@ -0,0 +1,48 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/check-names.R +\name{check_names} +\alias{check_names} +\title{Check Names} +\usage{ +check_names( + x, + names = character(0), + exclusive = FALSE, + order = FALSE, + x_name = NULL +) +} +\arguments{ +\item{x}{The object to check.} + +\item{names}{A character vector of the required names.} + +\item{exclusive}{A flag specifying whether x must only contain the required names.} + +\item{order}{A flag specifying whether the order of the required names in x must match the order in names.} + +\item{x_name}{A string of the name of object x or NULL.} +} +\value{ +An informative error if the test fails or an invisible copy of x. +} +\description{ +Checks the names of an object. +} +\examples{ +x <- c(x = 1, y = 2) +check_names(x, c("y", "x")) +try(check_names(x, c("y", "x"), order = TRUE)) +try(check_names(x, "x", exclusive = TRUE)) +} +\seealso{ +Other check: +\code{\link{check_data}()}, +\code{\link{check_dim}()}, +\code{\link{check_dirs}()}, +\code{\link{check_files}()}, +\code{\link{check_key}()}, +\code{\link{check_length}()}, +\code{\link{check_values}()} +} +\concept{check} diff --git a/chk.Rcheck/00_pkg_src/chk/man/check_values.Rd b/chk.Rcheck/00_pkg_src/chk/man/check_values.Rd new file mode 100644 index 00000000..7c1bfe54 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/check_values.Rd @@ -0,0 +1,59 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/check-values.R +\name{check_values} +\alias{check_values} +\title{Check Values and Class} +\usage{ +check_values(x, values, x_name = NULL) +} +\arguments{ +\item{x}{The object to check.} + +\item{values}{An atomic vector specifying the S3 class and possible values.} + +\item{x_name}{A string of the name of object x or NULL.} +} +\value{ +An informative error if the test fails or an invisible copy of x. +} +\description{ +Checks values and S3 class of an atomic object. +} +\details{ +To check the class simply pass a vector of the desired class. + +To check that x does not include missing values pass +a single non-missing value (of the correct class). + +To allow it to include missing values include a missing value. + +To check that it only includes missing values only pass +a missing value (of the correct class). + +To check the range of the values in x pass two non-missing values +(as well as the missing value if required). + +To check that x only includes specific values +pass three or more non-missing values. + +In the case of a factor ensure values has two levels to +check that the levels of x are an ordered superset of the levels of value +and three or more levels to check that they are identical. +} +\examples{ +check_values(1, numeric(0)) +check_values(1, 2) +try(check_values(1, 1L)) +try(check_values(NA_real_, 1)) +} +\seealso{ +Other check: +\code{\link{check_data}()}, +\code{\link{check_dim}()}, +\code{\link{check_dirs}()}, +\code{\link{check_files}()}, +\code{\link{check_key}()}, +\code{\link{check_length}()}, +\code{\link{check_names}()} +} +\concept{check} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk-package.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk-package.Rd new file mode 100644 index 00000000..2aa8fc33 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk-package.Rd @@ -0,0 +1,40 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-package.R +\docType{package} +\name{chk-package} +\alias{chk} +\alias{chk-package} +\title{chk: Check User-Supplied Function Arguments} +\description{ +\if{html}{\figure{logo.png}{options: style='float: right' alt='logo' width='120'}} + +For developers to check user-supplied function arguments. It is designed to be simple, fast and customizable. Error messages follow the tidyverse style guide. +} +\seealso{ +Useful links: +\itemize{ + \item \url{https://github.com/poissonconsulting/chk} + \item \url{https://poissonconsulting.github.io/chk/} + \item Report bugs at \url{https://github.com/poissonconsulting/chk/issues/} +} + +} +\author{ +\strong{Maintainer}: Joe Thorley \email{joe@poissonconsulting.ca} (\href{https://orcid.org/0000-0002-7683-4592}{ORCID}) + +Authors: +\itemize{ + \item Kirill Müller (\href{https://orcid.org/0000-0002-1416-3412}{ORCID}) + \item Ayla Pearson (\href{https://orcid.org/0000-0001-7388-1222}{ORCID}) +} + +Other contributors: +\itemize{ + \item Florencia D'Andrea [contributor] + \item Nadine Hussein \email{nadine@poissonconsulting.ca} (\href{https://orcid.org/0000-0003-4470-8361}{ORCID}) [contributor] + \item Evan Amies-Galonski \email{evan@poissonconsulting.ca} (\href{https://orcid.org/0000-0003-1096-2089}{ORCID}) [contributor] + \item Poisson Consulting [copyright holder, funder] +} + +} +\keyword{internal} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_all.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_all.Rd new file mode 100644 index 00000000..0c2f273e --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_all.Rd @@ -0,0 +1,59 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-all.R +\name{chk_all} +\alias{chk_all} +\alias{vld_all} +\title{Check All} +\usage{ +chk_all(x, chk_fun, ..., x_name = NULL) + +vld_all(x, vld_fun, ...) +} +\arguments{ +\item{x}{The object to check.} + +\item{chk_fun}{A chk_ function.} + +\item{...}{Additional arguments.} + +\item{x_name}{A string of the name of object x or NULL.} + +\item{vld_fun}{A vld_ function.} +} +\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 all elements using + +\code{all(vapply(x, chk_fun, TRUE, ...))} +} +\section{Functions}{ +\itemize{ +\item \code{vld_all()}: Validate All + +}} +\examples{ +# chk_all +chk_all(TRUE, chk_lgl) +# FIXME try(chk_all(1, chk_lgl)) +chk_all(c(TRUE, NA), chk_lgl) +# vld_all +vld_all(c(TRUE, NA), vld_lgl) +} +\seealso{ +\code{\link[=all]{all()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other all_checkers: +\code{\link{chk_all_equal}()}, +\code{\link{chk_all_equivalent}()}, +\code{\link{chk_all_identical}()} +} +\concept{all_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_all_equal.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_all_equal.Rd new file mode 100644 index 00000000..de0c4009 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_all_equal.Rd @@ -0,0 +1,66 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-all-equal.R +\name{chk_all_equal} +\alias{chk_all_equal} +\alias{vld_all_equal} +\title{Check All Equal} +\usage{ +chk_all_equal(x, tolerance = sqrt(.Machine$double.eps), x_name = NULL) + +vld_all_equal(x, tolerance = sqrt(.Machine$double.eps)) +} +\arguments{ +\item{x}{The object to check.} + +\item{tolerance}{A non-negative numeric scalar.} + +\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 all elements in x equal using + +\code{length(x) < 2L || all(vapply(x, vld_equal, TRUE, y = x[[1]], tolerance = tolerance))} +} +\section{Functions}{ +\itemize{ +\item \code{vld_all_equal()}: Validate All Equal + +}} +\examples{ +# chk_all_equal +chk_all_equal(c(1, 1.00000001)) +try(chk_all_equal(c(1, 1.0000001))) +chk_all_equal(list(c(x = 1), c(x = 1))) +try(chk_all_equal(list(c(x = 1), c(y = 1)))) +# vld_all_equal +vld_all_equal(c(1, 1L)) +} +\seealso{ +\code{\link[=length]{length()}} + +\code{\link[=vld_equal]{vld_equal()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other equal_checkers: +\code{\link{chk_all_equivalent}()}, +\code{\link{chk_all_identical}()}, +\code{\link{chk_equal}()}, +\code{\link{chk_equivalent}()}, +\code{\link{chk_identical}()} + +Other all_checkers: +\code{\link{chk_all}()}, +\code{\link{chk_all_equivalent}()}, +\code{\link{chk_all_identical}()} +} +\concept{all_checkers} +\concept{equal_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_all_equivalent.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_all_equivalent.Rd new file mode 100644 index 00000000..a960dce9 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_all_equivalent.Rd @@ -0,0 +1,66 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-all-equivalent.R +\name{chk_all_equivalent} +\alias{chk_all_equivalent} +\alias{vld_all_equivalent} +\title{Check All Equivalent} +\usage{ +chk_all_equivalent(x, tolerance = sqrt(.Machine$double.eps), x_name = NULL) + +vld_all_equivalent(x, tolerance = sqrt(.Machine$double.eps)) +} +\arguments{ +\item{x}{The object to check.} + +\item{tolerance}{A non-negative numeric scalar.} + +\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 all elements in x equivalent using + +\code{length(x) < 2L || all(vapply(x, vld_equivalent, TRUE, y = x[[1]], tolerance = tolerance))} +} +\section{Functions}{ +\itemize{ +\item \code{vld_all_equivalent()}: Validate All Equivalent + +}} +\examples{ +# chk_all_equivalent +chk_all_equivalent(c(1, 1.00000001)) +try(chk_all_equivalent(c(1, 1.0000001))) +chk_all_equivalent(list(c(x = 1), c(x = 1))) +chk_all_equivalent(list(c(x = 1), c(y = 1))) +# vld_all_equivalent +vld_all_equivalent(c(x = 1, y = 1)) +} +\seealso{ +\code{\link[=length]{length()}} + +\code{\link[=vld_equivalent]{vld_equivalent()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other equal_checkers: +\code{\link{chk_all_equal}()}, +\code{\link{chk_all_identical}()}, +\code{\link{chk_equal}()}, +\code{\link{chk_equivalent}()}, +\code{\link{chk_identical}()} + +Other all_checkers: +\code{\link{chk_all}()}, +\code{\link{chk_all_equal}()}, +\code{\link{chk_all_identical}()} +} +\concept{all_checkers} +\concept{equal_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_all_identical.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_all_identical.Rd new file mode 100644 index 00000000..3ade6bb4 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_all_identical.Rd @@ -0,0 +1,66 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-all-identical.R +\name{chk_all_identical} +\alias{chk_all_identical} +\alias{vld_all_identical} +\title{Check All Identical} +\usage{ +chk_all_identical(x, x_name = NULL) + +vld_all_identical(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 all elements in x identical using + +\code{length(x) < 2L || all(vapply(x, vld_identical, TRUE, y = x[[1]]))} + +\strong{Pass}: \code{c(1, 1, 1)}, \code{list(1, 1)} + +\strong{Fail}: \code{c(1, 1.0000001)}, \code{list(1, NA)} +} +\section{Functions}{ +\itemize{ +\item \code{vld_all_identical()}: Validate All Identical + +}} +\examples{ +# chk_all_identical +chk_all_identical(c(1, 1)) +try(chk_all_identical(c(1, 1.1))) +# vld_all_identical +vld_all_identical(c(1, 1)) +} +\seealso{ +\code{\link[=length]{length()}} + +\code{\link[=vld_identical]{vld_identical()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other equal_checkers: +\code{\link{chk_all_equal}()}, +\code{\link{chk_all_equivalent}()}, +\code{\link{chk_equal}()}, +\code{\link{chk_equivalent}()}, +\code{\link{chk_identical}()} + +Other all_checkers: +\code{\link{chk_all}()}, +\code{\link{chk_all_equal}()}, +\code{\link{chk_all_equivalent}()} +} +\concept{all_checkers} +\concept{equal_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_array.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_array.Rd new file mode 100644 index 00000000..7ab20f63 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_array.Rd @@ -0,0 +1,55 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-array.R +\name{chk_array} +\alias{chk_array} +\alias{vld_array} +\title{Check Array} +\usage{ +chk_array(x, x_name = NULL) + +vld_array(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 is an array using + +\code{is.array(x)} +} +\section{Functions}{ +\itemize{ +\item \code{vld_array()}: Validate Array + +}} +\examples{ +# chk_array +chk_array(array(1)) +try(chk_array(matrix(1))) + +# vld_array +vld_array(1) +vld_array(array(1)) +} +\seealso{ +\code{\link[=is.array]{is.array()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other data_structure_checkers: +\code{\link{chk_atomic}()}, +\code{\link{chk_list}()}, +\code{\link{chk_matrix}()}, +\code{\link{chk_vector}()} +} +\concept{data_structure_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_atomic.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_atomic.Rd new file mode 100644 index 00000000..d0ab1db3 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_atomic.Rd @@ -0,0 +1,57 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-atomic.R +\name{chk_atomic} +\alias{chk_atomic} +\alias{vld_atomic} +\title{Check Atomic} +\usage{ +chk_atomic(x, x_name = NULL) + +vld_atomic(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 atomic using + +\code{is.atomic(x)} +} +\section{Functions}{ +\itemize{ +\item \code{vld_atomic()}: Validate Atomic + +}} +\examples{ +# chk_atomic +chk_atomic(1) +try(chk_atomic(list(1))) +# vld_atomic +vld_atomic(1) +vld_atomic(matrix(1:3)) +vld_atomic(character(0)) +vld_atomic(list(1)) +vld_atomic(NULL) +} +\seealso{ +\code{\link[=is.atomic]{is.atomic()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other data_structure_checkers: +\code{\link{chk_array}()}, +\code{\link{chk_list}()}, +\code{\link{chk_matrix}()}, +\code{\link{chk_vector}()} +} +\concept{data_structure_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_character.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_character.Rd new file mode 100644 index 00000000..33623f1b --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_character.Rd @@ -0,0 +1,63 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-character.R +\name{chk_character} +\alias{chk_character} +\alias{vld_character} +\title{Check Character} +\usage{ +chk_character(x, x_name = NULL) + +vld_character(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 character using + +\code{is.character(x)} +} +\section{Functions}{ +\itemize{ +\item \code{vld_character()}: Validate Character + +}} +\examples{ +# chk_character +chk_character("1") +try(chk_character(1)) +# vld_character +vld_character("1") +vld_character(matrix("a")) +vld_character(character(0)) +vld_character(NA_character_) +vld_character(1) +vld_character(TRUE) +vld_character(factor("text")) +} +\seealso{ +\code{\link[=is.character]{is.character()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other data_type_checkers: +\code{\link{chk_character_or_factor}()}, +\code{\link{chk_complex}()}, +\code{\link{chk_double}()}, +\code{\link{chk_environment}()}, +\code{\link{chk_integer}()}, +\code{\link{chk_logical}()}, +\code{\link{chk_numeric}()}, +\code{\link{chk_raw}()} +} +\concept{data_type_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_character_or_factor.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_character_or_factor.Rd new file mode 100644 index 00000000..9d3de04b --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_character_or_factor.Rd @@ -0,0 +1,70 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-character-or-factor.R +\name{chk_character_or_factor} +\alias{chk_character_or_factor} +\alias{vld_character_or_factor} +\title{Check Character or Factor} +\usage{ +chk_character_or_factor(x, x_name = NULL) + +vld_character_or_factor(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 character or factor using + +\code{is.character(x) || is.factor(x)} +} +\section{Functions}{ +\itemize{ +\item \code{vld_character_or_factor()}: Validate Character or Factor + +}} +\examples{ +# chk_character_or_factor +chk_character_or_factor("1") +chk_character_or_factor(factor("1")) +try(chk_character(1)) +# vld_character_or_factor +vld_character_or_factor("1") +vld_character_or_factor(matrix("a")) +vld_character_or_factor(character(0)) +vld_character_or_factor(NA_character_) +vld_character_or_factor(1) +vld_character_or_factor(TRUE) +vld_character_or_factor(factor("text")) +} +\seealso{ +\code{\link[=is.character]{is.character()}} + +\code{\link[=is.factor]{is.factor()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other data_type_checkers: +\code{\link{chk_character}()}, +\code{\link{chk_complex}()}, +\code{\link{chk_double}()}, +\code{\link{chk_environment}()}, +\code{\link{chk_integer}()}, +\code{\link{chk_logical}()}, +\code{\link{chk_numeric}()}, +\code{\link{chk_raw}()} + +Other factor_checkers: +\code{\link{chk_factor}()} +} +\concept{data_type_checkers} +\concept{factor_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_chr.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_chr.Rd new file mode 100644 index 00000000..20c245c9 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_chr.Rd @@ -0,0 +1,54 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-chr.R +\name{chk_chr} +\alias{chk_chr} +\alias{vld_chr} +\title{Check Character Scalar} +\usage{ +chk_chr(x, x_name = NULL) + +vld_chr(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 character scalar using + +\code{is.character(x) && length(x) == 1L} + +\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} +} +\section{Functions}{ +\itemize{ +\item \code{vld_chr()}: Validate Character Scalar + +\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} + +}} +\examples{ +chk_chr("a") +try(chk_chr(1)) +# vld_chr +vld_chr("") +vld_chr("a") +vld_chr(NA_character_) +vld_chr(c("a", "b")) +vld_chr(1) +} +\seealso{ +Other deprecated: +\code{\link{chk_dbl}()}, +\code{\link{chk_deprecated}}, +\code{\link{chk_wnum}()} +} +\concept{chk_character} +\concept{deprecated} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_compatible_lengths.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_compatible_lengths.Rd new file mode 100644 index 00000000..3b9e7949 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_compatible_lengths.Rd @@ -0,0 +1,93 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-compatible-lengths.R +\name{chk_compatible_lengths} +\alias{chk_compatible_lengths} +\alias{vld_compatible_lengths} +\title{Check Compatible Lengths} +\usage{ +chk_compatible_lengths(..., x_name = NULL) + +vld_compatible_lengths(...) +} +\arguments{ +\item{...}{The objects to check for compatible lengths.} + +\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. +} +\description{ +Checks objects (including vectors) have lengths that could be 'strictly +recycled'. That is to say they must all be either zero length or the same +length with some of length 1. +} +\details{ +This function helps to check vectors could be 'strictly recycled.' +For example the function will error if you had a vector of length 2 and +length 4, even though the vector of length 2 could be 'loosely recycled' to +match up to the vector of length 4 when combined. + +The intent of the function is to check that only strict recycling is +occurring. +} +\section{Functions}{ +\itemize{ +\item \code{vld_compatible_lengths()}: Validate Compatible Lengths + +}} +\examples{ +# chk_compatible_lengths + +a <- integer(0) +b <- numeric(0) +chk_compatible_lengths(a, b) + +a <- 1 +b <- 2 +chk_compatible_lengths(a, b) + +a <- 1:3 +b <- 1:3 +chk_compatible_lengths(a, b) + +b <- 1 +chk_compatible_lengths(a, b) + +b <- 1:2 +try(chk_compatible_lengths(a, b)) + +b <- 1:6 +try(chk_compatible_lengths(a, b)) +# vld_compatible_lengths + +a <- integer(0) +b <- numeric(0) +vld_compatible_lengths(a, b) + +a <- 1 +b <- 2 +vld_compatible_lengths(a, b) + +a <- 1:3 +b <- 1:3 +vld_compatible_lengths(a, b) + +b <- 1 +vld_compatible_lengths(a, b) + +b <- 1:2 +vld_compatible_lengths(a, b) + +b <- 1:6 +vld_compatible_lengths(a, b) +} +\seealso{ +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other length_checkers: +\code{\link{chk_length}()} +} +\concept{length_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_complex.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_complex.Rd new file mode 100644 index 00000000..de768b56 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_complex.Rd @@ -0,0 +1,61 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-complex.R +\name{chk_complex} +\alias{chk_complex} +\alias{vld_complex} +\title{Check Complex} +\usage{ +chk_complex(x, x_name = NULL) + +vld_complex(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 complex using + +\code{is.complex(x)} +} +\section{Functions}{ +\itemize{ +\item \code{vld_complex()}: Validate Complex + +}} +\examples{ +# chk_complex +chk_complex(1i) +try(chk_complex(1)) +# vld_complex +vld_complex(1i) +vld_complex(complex()) +vld_complex(NA_complex_) +vld_complex(1) +vld_complex(TRUE) +} +\seealso{ +\code{\link[=is.complex]{is.complex()}} + +For more details about the use of this function, +please read the article +\href{https://poissonconsulting.github.io/chk/articles/chk-families.html}{chk families}. + +Other data_type_checkers: +\code{\link{chk_character}()}, +\code{\link{chk_character_or_factor}()}, +\code{\link{chk_double}()}, +\code{\link{chk_environment}()}, +\code{\link{chk_integer}()}, +\code{\link{chk_logical}()}, +\code{\link{chk_numeric}()}, +\code{\link{chk_raw}()} +} +\concept{data_type_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_complex_number.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_complex_number.Rd new file mode 100644 index 00000000..fe49151d --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_complex_number.Rd @@ -0,0 +1,54 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-complex-number.R +\name{chk_complex_number} +\alias{chk_complex_number} +\alias{vld_complex_number} +\title{Check Complex Number} +\usage{ +chk_complex_number(x, x_name = NULL) + +vld_complex_number(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 non-missing complex scalar using + +\code{is.complex(x) && length(x) == 1L && !anyNA(x)} +} +\section{Functions}{ +\itemize{ +\item \code{vld_complex_number()}: Validate Complex Number + +}} +\examples{ +# chk_complex_number +chk_complex_number(as.complex(1.1)) +try(chk_complex_number(1.1)) +# vld_complex_number +vld_complex_number(as.complex(2)) +} +\seealso{ +\code{\link[=is.integer]{is.integer()}} + +\code{\link[=vld_true]{vld_true()}} + +\code{\link[=vld_number]{vld_number()}} + +For more details about the use of this function, +please read the article +\href{https://poissonconsulting.github.io/chk/articles/chk-families.html}{chk families}. + +Other scalar_checker: +\code{\link{chk_whole_number}()} +} +\concept{scalar_checker} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_count.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_count.Rd new file mode 100644 index 00000000..536bcd74 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_count.Rd @@ -0,0 +1,68 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-count.R +\name{chk_count} +\alias{chk_count} +\alias{vld_count} +\title{Check Count} +\usage{ +chk_count(x, x_name = NULL) + +vld_count(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 non-negative whole number using + +\code{vld_whole_number(x) && x >= 0} +} +\section{Functions}{ +\itemize{ +\item \code{vld_count()}: Validate Count + +}} +\examples{ +# chk_count +chk_count(1) +try(chk_count(1.5)) +# vld_count +vld_count(1) +vld_count(0L) +vld_count(-1) +vld_count(0.5) +} +\seealso{ +\code{\link[=vld_whole_number]{vld_whole_number()}} + +\code{\link[=length]{length()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other scalar_checkers: +\code{\link{chk_date}()}, +\code{\link{chk_date_time}()}, +\code{\link{chk_false}()}, +\code{\link{chk_flag}()}, +\code{\link{chk_lgl}()}, +\code{\link{chk_scalar}()}, +\code{\link{chk_string}()}, +\code{\link{chk_true}()}, +\code{\link{chk_tz}()} + +Other whole_number_checkers: +\code{\link{chk_whole_number}()}, +\code{\link{chk_whole_numeric}()} +} +\concept{scalar_checkers} +\concept{whole_number_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_data.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_data.Rd new file mode 100644 index 00000000..2d585023 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_data.Rd @@ -0,0 +1,57 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-data.R +\name{chk_data} +\alias{chk_data} +\alias{vld_data} +\title{Check Data} +\usage{ +chk_data(x, x_name = NULL) + +vld_data(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 data.frame using + +\code{inherits(x, "data.frame")} + +Note that there is a similar function, \code{\link[=check_data]{check_data()}}, which checks +the column names, values, number of rows, and keys of a data.frame. +} +\section{Functions}{ +\itemize{ +\item \code{vld_data()}: Validate Data + +}} +\examples{ +# chk_data +chk_data(data.frame(x = 1)) +try(chk_data(1)) +# vld_data +vld_data(data.frame()) +vld_data(data.frame(x = 1)) +vld_data(c(x = 1)) +} +\seealso{ +\code{\link[=inherits]{inherits()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other id_checkers: +\code{\link{chk_is}()}, +\code{\link{chk_s3_class}()}, +\code{\link{chk_s4_class}()} +} +\concept{id_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_date.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_date.Rd new file mode 100644 index 00000000..874e42a6 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_date.Rd @@ -0,0 +1,66 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-date.R +\name{chk_date} +\alias{chk_date} +\alias{vld_date} +\title{Check Date} +\usage{ +chk_date(x, x_name = NULL) + +vld_date(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 non-missing Date scalar using + +\code{inherits(x, "Date") && length(x) == 1L && !anyNA(x)} +} +\section{Functions}{ +\itemize{ +\item \code{vld_date()}: Validate Date + +}} +\examples{ +# chk_date +chk_date(Sys.Date()) +try(chk_date(1)) +# vld_date +vld_date(Sys.Date()) +vld_date(Sys.time()) +vld_date(1) +} +\seealso{ +\code{\link[=inherits]{inherits()}} + +\code{\link[=length]{length()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other scalar_checkers: +\code{\link{chk_count}()}, +\code{\link{chk_date_time}()}, +\code{\link{chk_false}()}, +\code{\link{chk_flag}()}, +\code{\link{chk_lgl}()}, +\code{\link{chk_scalar}()}, +\code{\link{chk_string}()}, +\code{\link{chk_true}()}, +\code{\link{chk_tz}()} + +Other datetime_checkers: +\code{\link{chk_date_time}()} +} +\concept{datetime_checkers} +\concept{scalar_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_date_time.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_date_time.Rd new file mode 100644 index 00000000..6ce5601b --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_date_time.Rd @@ -0,0 +1,80 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-datetime.R +\name{chk_date_time} +\alias{chk_date_time} +\alias{chk_datetime} +\alias{vld_date_time} +\alias{vld_datetime} +\title{Check Date Time} +\usage{ +chk_date_time(x, x_name = NULL) + +chk_datetime(x, x_name = NULL) + +vld_date_time(x) + +vld_datetime(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 non-missing POSIXct scalar using + +\code{inherits(x, "POSIXct") && length(x) == 1L && !anyNA(x)} +} +\section{Functions}{ +\itemize{ +\item \code{chk_datetime()}: Check Date Time (Deprecated) + +\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} + +\item \code{vld_date_time()}: Validate Date Time + +\item \code{vld_datetime()}: Validate Date Time (Deprecated) + +\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} + +}} +\examples{ +# chk_date_time +chk_date_time(as.POSIXct("2001-01-02")) +try(chk_date_time(1)) +# vld_date_time +vld_date_time(as.POSIXct("2001-01-02")) +vld_date_time(Sys.time()) +vld_date_time(1) +vld_date_time("2001-01-02") +vld_date_time(c(Sys.time(), Sys.time())) +} +\seealso{ +\code{\link[=inherits]{inherits()}}, \code{\link[=length]{length()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other scalar_checkers: +\code{\link{chk_count}()}, +\code{\link{chk_date}()}, +\code{\link{chk_false}()}, +\code{\link{chk_flag}()}, +\code{\link{chk_lgl}()}, +\code{\link{chk_scalar}()}, +\code{\link{chk_string}()}, +\code{\link{chk_true}()}, +\code{\link{chk_tz}()} + +Other datetime_checkers: +\code{\link{chk_date}()} +} +\concept{datetime_checkers} +\concept{scalar_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_dbl.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_dbl.Rd new file mode 100644 index 00000000..6b9a7247 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_dbl.Rd @@ -0,0 +1,54 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-dbl.R +\name{chk_dbl} +\alias{chk_dbl} +\alias{vld_dbl} +\title{Check Double Scalar} +\usage{ +chk_dbl(x, x_name = NULL) + +vld_dbl(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 double scalar using + +\code{is.double(x) && length(x) == 1L} + +\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} +} +\section{Functions}{ +\itemize{ +\item \code{vld_dbl()}: Validate Double + +\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} + +}} +\examples{ +# chk_dbl +chk_dbl(1) +try(chk_dbl(1L)) +# vld_dbl +vld_dbl(1) +vld_dbl(double(0)) +vld_dbl(NA_real_) +vld_dbl(c(1, 1)) +vld_dbl(1L) +} +\seealso{ +Other deprecated: +\code{\link{chk_chr}()}, +\code{\link{chk_deprecated}}, +\code{\link{chk_wnum}()} +} +\concept{deprecated} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_deprecated.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_deprecated.Rd new file mode 100644 index 00000000..ef232d26 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_deprecated.Rd @@ -0,0 +1,124 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/deprecated.R +\name{chk_deprecated} +\alias{chk_deprecated} +\alias{chk_dirs} +\alias{chk_files} +\alias{chk_has} +\alias{chk_in} +\alias{chk_no_missing} +\alias{vld_no_missing} +\alias{chk_off} +\alias{chk_on} +\alias{is_chk_on} +\alias{chk_proportion} +\alias{deparse_backtick} +\title{Deprecated functions} +\usage{ +chk_dirs(x) + +chk_files(x) + +chk_has(x, values, x_name = NULL) + +chk_in(x, values, x_name = NULL) + +chk_no_missing(x, x_name = NULL) + +vld_no_missing(x) + +chk_off() + +chk_on() + +is_chk_on() + +chk_proportion(x, x_name = NULL) + +deparse_backtick(x) +} +\arguments{ +\item{x}{The object to check.} + +\item{x_name}{A string of the name of object x or NULL.} +} +\description{ +Deprecated \code{chk_()} functions. +} +\section{Functions}{ +\itemize{ +\item \code{chk_dirs()}: Check Directories Exist + +\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} + +Replace with \verb{[chk_all](x, [chk_dir])} + +\item \code{chk_files()}: Check Files Exist + +\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} + +Replace with \verb{[chk_all](x, [chk_file])} + +\item \code{chk_has()}: Check Has + +\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} + +Replace by \code{\link[=chk_superset]{chk_superset()}} + +\item \code{chk_in()}: Check In + +\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} + +Replace by \code{\link[=chk_subset]{chk_subset()}} + +\item \code{chk_no_missing()}: Check No Missing Values + +\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} + +Replace with \code{\link[=chk_not_any_na]{chk_not_any_na()}} + +\item \code{vld_no_missing()}: Validate No Missing Values + +\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} + +Replace with \code{\link[=vld_not_any_na]{vld_not_any_na()}} + +\item \code{chk_off()}: Turns checking off + +\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} + +This approach is no longer recommended + +\item \code{chk_on()}: Turns checking on + +\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} + +This approach is no longer recommended + +\item \code{is_chk_on()}: Tests checking on + +\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} + +This approach is no longer recommended + +\item \code{chk_proportion()}: Check Proportion + +\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} + +Replace by \verb{[chk_number](x); [chk_range](x)} + +\item \code{deparse_backtick()}: Deparse Backtick + +\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} + +Replace with \code{\link[=deparse_backtick_chk]{deparse_backtick_chk()}} + +}} +\seealso{ +Other deprecated: +\code{\link{chk_chr}()}, +\code{\link{chk_dbl}()}, +\code{\link{chk_wnum}()} +} +\concept{deprecated} +\keyword{internal} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_dir.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_dir.Rd new file mode 100644 index 00000000..a9b2a6f9 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_dir.Rd @@ -0,0 +1,55 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-dir.R +\name{chk_dir} +\alias{chk_dir} +\alias{vld_dir} +\title{Check Directory Exists} +\usage{ +chk_dir(x, x_name = NULL) + +vld_dir(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 directory exists using + +\code{vld_string(x) && dir.exists(x)} +} +\section{Functions}{ +\itemize{ +\item \code{vld_dir()}: Validate Directory Exists + +}} +\examples{ +# chk_dir +chk_dir(tempdir()) +try(chk_dir(tempfile())) +# vld_dir +vld_dir(1) +vld_dir(tempdir()) +vld_dir(tempfile()) +} +\seealso{ +\code{\link[=vld_string]{vld_string()}} + +\code{\link[=dir.exists]{dir.exists()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other file_checkers: +\code{\link{chk_ext}()}, +\code{\link{chk_file}()} +} +\concept{file_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_double.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_double.Rd new file mode 100644 index 00000000..286e19ec --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_double.Rd @@ -0,0 +1,63 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-double.R +\name{chk_double} +\alias{chk_double} +\alias{vld_double} +\title{Check Double} +\usage{ +chk_double(x, x_name = NULL) + +vld_double(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 double using + +\code{is.double(x)} +} +\section{Functions}{ +\itemize{ +\item \code{vld_double()}: Validate Double + +}} +\examples{ +# chk_double +chk_double(1) +try(chk_double(1L)) +# vld_double +vld_double(1) +vld_double(matrix(c(1, 2, 3, 4), nrow = 2L)) +vld_double(double(0)) +vld_double(numeric(0)) +vld_double(NA_real_) +vld_double(1L) +vld_double(TRUE) +} +\seealso{ +\code{\link[=is.double]{is.double()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other data_type_checkers: +\code{\link{chk_character}()}, +\code{\link{chk_character_or_factor}()}, +\code{\link{chk_complex}()}, +\code{\link{chk_environment}()}, +\code{\link{chk_integer}()}, +\code{\link{chk_logical}()}, +\code{\link{chk_numeric}()}, +\code{\link{chk_raw}()} +} +\concept{data_type_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_environment.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_environment.Rd new file mode 100644 index 00000000..815a5dc2 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_environment.Rd @@ -0,0 +1,60 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-environment.R +\name{chk_environment} +\alias{chk_environment} +\alias{vld_environment} +\title{Check Environment} +\usage{ +chk_environment(x, x_name = NULL) + +vld_environment(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 environment using + +\code{is.environment(x)} +} +\section{Functions}{ +\itemize{ +\item \code{vld_environment()}: Validate Environment + +}} +\examples{ +# chk_environment +chk_environment(.GlobalEnv) +try(chk_environment(1)) +# vld_environment +vld_environment(1) +vld_environment(list(1)) +vld_environment(.GlobalEnv) +vld_environment(environment()) +} +\seealso{ +\code{\link[=is.environment]{is.environment()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other data_type_checkers: +\code{\link{chk_character}()}, +\code{\link{chk_character_or_factor}()}, +\code{\link{chk_complex}()}, +\code{\link{chk_double}()}, +\code{\link{chk_integer}()}, +\code{\link{chk_logical}()}, +\code{\link{chk_numeric}()}, +\code{\link{chk_raw}()} +} +\concept{data_type_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_equal.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_equal.Rd new file mode 100644 index 00000000..689bf643 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_equal.Rd @@ -0,0 +1,62 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-equal.R +\name{chk_equal} +\alias{chk_equal} +\alias{vld_equal} +\title{Check Equal} +\usage{ +chk_equal(x, y, tolerance = sqrt(.Machine$double.eps), x_name = NULL) + +vld_equal(x, y, tolerance = sqrt(.Machine$double.eps)) +} +\arguments{ +\item{x}{The object to check.} + +\item{y}{An object to check against.} + +\item{tolerance}{A non-negative numeric scalar.} + +\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 is equal (identical within tolerance) to y using + +\code{vld_true(all.equal(x, y, tolerance))} +} +\section{Functions}{ +\itemize{ +\item \code{vld_equal()}: Validate Equal + +}} +\examples{ +# chk_equal +chk_equal(1, 1.00000001) +try(chk_equal(1, 1.0000001)) +chk_equal(1, 1L) +chk_equal(c(x = 1), c(x = 1L)) +try(chk_equal(c(x = 1), c(y = 1L))) +vld_equal(1, 1.00000001) +} +\seealso{ +\code{\link[=vld_true]{vld_true()}} + +\code{\link[=all.equal]{all.equal()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other equal_checkers: +\code{\link{chk_all_equal}()}, +\code{\link{chk_all_equivalent}()}, +\code{\link{chk_all_identical}()}, +\code{\link{chk_equivalent}()}, +\code{\link{chk_identical}()} +} +\concept{equal_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_equivalent.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_equivalent.Rd new file mode 100644 index 00000000..d36d2c96 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_equivalent.Rd @@ -0,0 +1,61 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-equivalent.R +\name{chk_equivalent} +\alias{chk_equivalent} +\alias{vld_equivalent} +\title{Check Equivalent} +\usage{ +chk_equivalent(x, y, tolerance = sqrt(.Machine$double.eps), x_name = NULL) + +vld_equivalent(x, y, tolerance = sqrt(.Machine$double.eps)) +} +\arguments{ +\item{x}{The object to check.} + +\item{y}{An object to check against.} + +\item{tolerance}{A non-negative numeric scalar.} + +\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 is equivalent (equal ignoring attributes) to y using + +\code{vld_true(all.equal(x, y, tolerance, check.attributes = FALSE))} +} +\section{Functions}{ +\itemize{ +\item \code{vld_equivalent()}: Validate Equivalent + +}} +\examples{ +# chk_equivalent +chk_equivalent(1, 1.00000001) +try(chk_equivalent(1, 1.0000001)) +chk_equivalent(1, 1L) +chk_equivalent(c(x = 1), c(y = 1)) +vld_equivalent(c(x = 1), c(y = 1L)) +} +\seealso{ +\code{\link[=vld_true]{vld_true()}} + +\code{\link[=all.equal]{all.equal()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other equal_checkers: +\code{\link{chk_all_equal}()}, +\code{\link{chk_all_equivalent}()}, +\code{\link{chk_all_identical}()}, +\code{\link{chk_equal}()}, +\code{\link{chk_identical}()} +} +\concept{equal_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_ext.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_ext.Rd new file mode 100644 index 00000000..95f3cc19 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_ext.Rd @@ -0,0 +1,59 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-ext.R +\name{chk_ext} +\alias{chk_ext} +\alias{vld_ext} +\title{Check File Extension} +\usage{ +chk_ext(x, ext, x_name = NULL) + +vld_ext(x, ext) +} +\arguments{ +\item{x}{The object to check.} + +\item{ext}{A character vector of the permitted file extensions +(without the .).} + +\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 extension using + +\code{vld_string(x) && vld_subset(tools::file_ext(x), ext)} + +The user may want to use \code{\link[=toupper]{toupper()}} or \code{\link[=tolower]{tolower()}} +to ensure the case matches. +} +\section{Functions}{ +\itemize{ +\item \code{vld_ext()}: Validate File Extension + +}} +\examples{ +# chk_ext +try(chk_ext("file1.pdf", "png")) +# vld_ext +vld_ext("oeu.pdf", "pdf") +vld_ext(toupper("oeu.pdf"), "PDF") +} +\seealso{ +\code{\link[=vld_string]{vld_string()}} + +\code{\link[=vld_subset]{vld_subset()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other file_checkers: +\code{\link{chk_dir}()}, +\code{\link{chk_file}()} +} +\concept{file_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_factor.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_factor.Rd new file mode 100644 index 00000000..bff59b87 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_factor.Rd @@ -0,0 +1,54 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-factor.R +\name{chk_factor} +\alias{chk_factor} +\alias{vld_factor} +\title{Check Factor} +\usage{ +chk_factor(x, x_name = NULL) + +vld_factor(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 factor using + +\code{is.factor(x)} +} +\section{Functions}{ +\itemize{ +\item \code{vld_factor()}: Validate Factor + +}} +\examples{ +# chk_factor +chk_factor(factor("1")) +try(chk_factor("1")) +# vld_factor +vld_factor(factor("1")) +vld_factor(factor(0)) +vld_factor("1") +vld_factor(1L) +} +\seealso{ +\code{\link[=is.factor]{is.factor()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other factor_checkers: +\code{\link{chk_character_or_factor}()} +} +\concept{data-type_checkers} +\concept{factor_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_false.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_false.Rd new file mode 100644 index 00000000..0303c5a2 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_false.Rd @@ -0,0 +1,71 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-false.R +\name{chk_false} +\alias{chk_false} +\alias{vld_false} +\title{Check FALSE} +\usage{ +chk_false(x, x_name = NULL) + +vld_false(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{ +Check if FALSE using + +\code{is.logical(x) && length(x) == 1L && !anyNA(x) && !x} +} +\section{Functions}{ +\itemize{ +\item \code{vld_false()}: Validate FALSE + +}} +\examples{ +# chk_false +chk_false(FALSE) +try(chk_false(0)) +# vld_false +vld_false(TRUE) +vld_false(FALSE) +vld_false(NA) +vld_false(0) +vld_false(c(FALSE, FALSE)) +} +\seealso{ +\code{\link[=is.logical]{is.logical()}} + +\code{\link[=length]{length()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other logical_checkers: +\code{\link{chk_flag}()}, +\code{\link{chk_lgl}()}, +\code{\link{chk_logical}()}, +\code{\link{chk_true}()} + +Other scalar_checkers: +\code{\link{chk_count}()}, +\code{\link{chk_date}()}, +\code{\link{chk_date_time}()}, +\code{\link{chk_flag}()}, +\code{\link{chk_lgl}()}, +\code{\link{chk_scalar}()}, +\code{\link{chk_string}()}, +\code{\link{chk_true}()}, +\code{\link{chk_tz}()} +} +\concept{logical_checkers} +\concept{scalar_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_file.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_file.Rd new file mode 100644 index 00000000..757c917e --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_file.Rd @@ -0,0 +1,54 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-file.R +\name{chk_file} +\alias{chk_file} +\alias{vld_file} +\title{Check File Exists} +\usage{ +chk_file(x, x_name = NULL) + +vld_file(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 file exists using + +\code{vld_string(x) && file.exists(x) && !dir.exists(x)} +} +\section{Functions}{ +\itemize{ +\item \code{vld_file()}: Validate File Exists + +}} +\examples{ +# chk_file +try(chk_file(tempfile())) +# vld_file +vld_file(tempfile()) +} +\seealso{ +\code{\link[=vld_string]{vld_string()}} + +\code{\link[=file.exists]{file.exists()}} + +\code{\link[=dir.exists]{dir.exists()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other file_checkers: +\code{\link{chk_dir}()}, +\code{\link{chk_ext}()} +} +\concept{file_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_flag.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_flag.Rd new file mode 100644 index 00000000..8d46364c --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_flag.Rd @@ -0,0 +1,74 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-flag.R +\name{chk_flag} +\alias{chk_flag} +\alias{vld_flag} +\title{Check Flag} +\usage{ +chk_flag(x, x_name = NULL) + +vld_flag(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 non-missing logical scalar using + +\code{is.logical(x) && length(x) == 1L && !anyNA(x)} + +\strong{Pass}: \code{TRUE}, \code{FALSE}. + +\strong{Fail}: \code{logical(0)}, \code{c(TRUE, TRUE)}, \code{"TRUE"}, \code{1}, \code{NA}. + +Do not confuse this function with \code{\link[=chk_lgl]{chk_lgl()}}, +which also checks for logical scalars of \code{length(x) == 1} +but can include \code{NA}s. +} +\section{Functions}{ +\itemize{ +\item \code{vld_flag()}: Validate Flag + +}} +\examples{ +# chk_flag +chk_flag(TRUE) +try(vld_flag(1)) +# vld_flag +vld_flag(TRUE) +vld_flag(1) +} +\seealso{ +\code{\link[=is.logical]{is.logical()}} \code{\link[=length]{length()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other logical_checkers: +\code{\link{chk_false}()}, +\code{\link{chk_lgl}()}, +\code{\link{chk_logical}()}, +\code{\link{chk_true}()} + +Other scalar_checkers: +\code{\link{chk_count}()}, +\code{\link{chk_date}()}, +\code{\link{chk_date_time}()}, +\code{\link{chk_false}()}, +\code{\link{chk_lgl}()}, +\code{\link{chk_scalar}()}, +\code{\link{chk_string}()}, +\code{\link{chk_true}()}, +\code{\link{chk_tz}()} +} +\concept{logical_checkers} +\concept{scalar_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_function.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_function.Rd new file mode 100644 index 00000000..76272a44 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_function.Rd @@ -0,0 +1,58 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-function.R +\name{chk_function} +\alias{chk_function} +\alias{vld_function} +\title{Check Function} +\usage{ +chk_function(x, formals = NULL, x_name = NULL) + +vld_function(x, formals = NULL) +} +\arguments{ +\item{x}{The object to check.} + +\item{formals}{A count of the number of formal arguments.} + +\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 is a function using + +\code{is.function(x) && (is.null(formals) || length(formals(x)) == formals)} +} +\section{Functions}{ +\itemize{ +\item \code{vld_function()}: Validate Function + +}} +\examples{ +# chk_function +chk_function(mean) +try(chk_function(1)) +# vld_function +vld_function(mean) +vld_function(function(x) x) +vld_function(1) +vld_function(list(1)) +} +\seealso{ +\code{\link[=is.function]{is.function()}} \code{\link[=formals]{formals()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other missing_checkers: +\code{\link{chk_missing}()}, +\code{\link{chk_not_missing}()} +} +\concept{ellpisis_checkers} +\concept{function_checkers} +\concept{missing_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_gt.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_gt.Rd new file mode 100644 index 00000000..d0f1ecda --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_gt.Rd @@ -0,0 +1,61 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-gt.R +\name{chk_gt} +\alias{chk_gt} +\alias{vld_gt} +\title{Check Greater Than} +\usage{ +chk_gt(x, value = 0, x_name = NULL) + +vld_gt(x, value = 0) +} +\arguments{ +\item{x}{The object to check.} + +\item{value}{A non-missing scalar of a value.} + +\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 non-missing values are greater than value using + +\code{all(x[!is.na(x)] > value)} +} +\section{Functions}{ +\itemize{ +\item \code{vld_gt()}: Validate Greater Than + +}} +\examples{ +# chk_gt +chk_gt(0.1) +try(chk_gt(c(0.1, -0.2))) +# vld_gt +vld_gt(numeric(0)) +vld_gt(0) +vld_gt(0.1) +vld_gt(c(0.1, 0.2, NA)) +vld_gt(c(0.1, -0.2)) +vld_gt(c(-0.1, 0.2), value = -1) +vld_gt("b", value = "a") +} +\seealso{ +\code{\link[=all]{all()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other range_checkers: +\code{\link{chk_gte}()}, +\code{\link{chk_lt}()}, +\code{\link{chk_lte}()}, +\code{\link{chk_range}()} +} +\concept{range_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_gte.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_gte.Rd new file mode 100644 index 00000000..2c49441d --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_gte.Rd @@ -0,0 +1,59 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-gte.R +\name{chk_gte} +\alias{chk_gte} +\alias{vld_gte} +\title{Check Greater Than or Equal To} +\usage{ +chk_gte(x, value = 0, x_name = NULL) + +vld_gte(x, value = 0) +} +\arguments{ +\item{x}{The object to check.} + +\item{value}{A non-missing scalar of a value.} + +\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 non-missing values are greater than or equal to y using + +\code{all(x[!is.na(x)] >= value)} +} +\section{Functions}{ +\itemize{ +\item \code{vld_gte()}: Validate Greater Than or Equal To + +}} +\examples{ +# chk_gte +chk_gte(0) +try(chk_gte(-0.1)) +# vld_gte +vld_gte(numeric(0)) +vld_gte(0) +vld_gte(-0.1) +vld_gte(c(0.1, 0.2, NA)) +vld_gte(c(0.1, 0.2, NA), value = 1) +} +\seealso{ +\code{\link[=all]{all()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other range_checkers: +\code{\link{chk_gt}()}, +\code{\link{chk_lt}()}, +\code{\link{chk_lte}()}, +\code{\link{chk_range}()} +} +\concept{range_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_identical.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_identical.Rd new file mode 100644 index 00000000..0a7962fe --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_identical.Rd @@ -0,0 +1,57 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-identical.R +\name{chk_identical} +\alias{chk_identical} +\alias{vld_identical} +\title{Check Identical} +\usage{ +chk_identical(x, y, x_name = NULL) + +vld_identical(x, y) +} +\arguments{ +\item{x}{The object to check.} + +\item{y}{An object to check against.} + +\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 is identical to y using + +\code{identical(x, y)} +} +\section{Functions}{ +\itemize{ +\item \code{vld_identical()}: Validate Identical + +}} +\examples{ +# chk_identical +chk_identical(1, 1) +try(chk_identical(1, 1L)) +chk_identical(c(1, 1), c(1, 1)) +try(chk_identical(1, c(1, 1))) +vld_identical(1, 1) +} +\seealso{ +\code{\link[=identical]{identical()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other equal_checkers: +\code{\link{chk_all_equal}()}, +\code{\link{chk_all_equivalent}()}, +\code{\link{chk_all_identical}()}, +\code{\link{chk_equal}()}, +\code{\link{chk_equivalent}()} +} +\concept{equal_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_integer.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_integer.Rd new file mode 100644 index 00000000..f537aded --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_integer.Rd @@ -0,0 +1,62 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-integer.R +\name{chk_integer} +\alias{chk_integer} +\alias{vld_integer} +\title{Check Integer} +\usage{ +chk_integer(x, x_name = NULL) + +vld_integer(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 integer using + +\code{is.integer(x)} +} +\section{Functions}{ +\itemize{ +\item \code{vld_integer()}: Validate Integer + +}} +\examples{ +# chk_integer +chk_integer(1L) +try(chk_integer(1)) +# vld_integer +vld_integer(1L) +vld_integer(matrix(1:4, nrow = 2L)) +vld_integer(integer(0)) +vld_integer(NA_integer_) +vld_integer(1) +vld_integer(TRUE) +} +\seealso{ +\code{\link[=is.integer]{is.integer()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other data_type_checkers: +\code{\link{chk_character}()}, +\code{\link{chk_character_or_factor}()}, +\code{\link{chk_complex}()}, +\code{\link{chk_double}()}, +\code{\link{chk_environment}()}, +\code{\link{chk_logical}()}, +\code{\link{chk_numeric}()}, +\code{\link{chk_raw}()} +} +\concept{data_type_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_is.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_is.Rd new file mode 100644 index 00000000..b8b10dac --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_is.Rd @@ -0,0 +1,55 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-is.R +\name{chk_is} +\alias{chk_is} +\alias{vld_is} +\title{Check Class} +\usage{ +chk_is(x, class, x_name = NULL) + +vld_is(x, class) +} +\arguments{ +\item{x}{The object to check.} + +\item{class}{A character vector specifying the possible class values.} + +\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 inherits from class using + +\code{inherits(x, class)} +} +\section{Functions}{ +\itemize{ +\item \code{vld_is()}: Validate Inherits from Class + +}} +\examples{ +chk_is(1, "numeric") +try(chk_is(1L, "double")) + +# vld_is +vld_is(numeric(0), "numeric") +vld_is(1L, "double") +} +\seealso{ +\code{\link[=inherits]{inherits()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other id_checkers: +\code{\link{chk_data}()}, +\code{\link{chk_s3_class}()}, +\code{\link{chk_s4_class}()} +} +\concept{id_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_join.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_join.Rd new file mode 100644 index 00000000..5bcd66bd --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_join.Rd @@ -0,0 +1,56 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-join.R +\name{chk_join} +\alias{chk_join} +\alias{vld_join} +\title{Check Join} +\usage{ +chk_join(x, y, by, x_name = NULL) + +vld_join(x, y, by) +} +\arguments{ +\item{x}{The object to check.} + +\item{y}{A data.frame with columns in by.} + +\item{by}{A character vector specifying the column names to join x and y on. +If named the names are the corresponding columns in x.} + +\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 rows in x match at least one in y. +} +\section{Functions}{ +\itemize{ +\item \code{vld_join()}: Validate Join + +}} +\examples{ +# chk_join +chk_join(data.frame(z = 1), data.frame(z = 1:2), by = "z") +try(chk_join(data.frame(z = 1), data.frame(z = 2), by = "z")) +# vld_join +vld_join(data.frame(z = 1), data.frame(z = 1:2), by = "z") +vld_join(data.frame(z = 1), data.frame(z = 2), by = "z") +vld_join(data.frame(z = 1), data.frame(a = 1:2), by = c(z = "a")) +vld_join(data.frame(z = 1), data.frame(a = 2), by = c(z = "a")) +} +\seealso{ +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other misc_checkers: +\code{\link{chk_not_any_na}()}, +\code{\link{chk_not_empty}()}, +\code{\link{chk_unique}()} +} +\concept{misc_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_length.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_length.Rd new file mode 100644 index 00000000..2db2a247 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_length.Rd @@ -0,0 +1,55 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-length.R +\name{chk_length} +\alias{chk_length} +\alias{vld_length} +\title{Check Length} +\usage{ +chk_length(x, length = 1L, upper = length, x_name = NULL) + +vld_length(x, length = 1L, upper = length) +} +\arguments{ +\item{x}{The object to check.} + +\item{length}{A count of the length.} + +\item{upper}{A count of the max length.} + +\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 length is a particular value or range using + +\code{length(x) >= length && length(x) <= upper} +} +\section{Functions}{ +\itemize{ +\item \code{vld_length()}: Validate Length + +}} +\examples{ +# chk_length +chk_length("text") +try(vld_length("text", length = 2)) +# vld_length +vld_length(2:1, 2) +vld_length(2:1, 1) +} +\seealso{ +\code{\link[=length]{length()}}, \code{\link[=check_length]{check_length()}}, \code{\link[=check_dim]{check_dim()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other length_checkers: +\code{\link{chk_compatible_lengths}()} +} +\concept{length_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_lgl.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_lgl.Rd new file mode 100644 index 00000000..121e7cef --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_lgl.Rd @@ -0,0 +1,74 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-lgl.R +\name{chk_lgl} +\alias{chk_lgl} +\alias{vld_lgl} +\title{Check Logical Scalar} +\usage{ +chk_lgl(x, x_name = NULL) + +vld_lgl(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 logical scalar using + +\code{is.logical(x) && length(x) == 1L} + +If you only want to check the data type (not whether \code{length(x) == 1}), +you should use the \code{\link[=chk_logical]{chk_logical()}} function. +} +\section{Functions}{ +\itemize{ +\item \code{vld_lgl()}: Validate Logical Scalar + +}} +\examples{ +# chk_lgl +chk_lgl(NA) +try(chk_lgl(1)) +# vld_lgl +vld_lgl(TRUE) +vld_lgl(FALSE) +vld_lgl(NA) +vld_lgl(1) +vld_lgl(c(TRUE, TRUE)) +} +\seealso{ +\code{\link[=is.logical]{is.logical()}} + +\code{\link[=length]{length()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other logical_checkers: +\code{\link{chk_false}()}, +\code{\link{chk_flag}()}, +\code{\link{chk_logical}()}, +\code{\link{chk_true}()} + +Other scalar_checkers: +\code{\link{chk_count}()}, +\code{\link{chk_date}()}, +\code{\link{chk_date_time}()}, +\code{\link{chk_false}()}, +\code{\link{chk_flag}()}, +\code{\link{chk_scalar}()}, +\code{\link{chk_string}()}, +\code{\link{chk_true}()}, +\code{\link{chk_tz}()} +} +\concept{logical_checkers} +\concept{scalar_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_list.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_list.Rd new file mode 100644 index 00000000..05a00817 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_list.Rd @@ -0,0 +1,57 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-list.R +\name{chk_list} +\alias{chk_list} +\alias{vld_list} +\title{Check List} +\usage{ +chk_list(x, x_name = NULL) + +vld_list(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 is a list using + +\code{is.list(x)} +} +\section{Functions}{ +\itemize{ +\item \code{vld_list()}: Validate List + +}} +\examples{ +# chk_list +chk_list(list()) +try(chk_list(1)) +# vld_list +vld_list(list()) +vld_list(list(x = 1)) +vld_list(mtcars) +vld_list(1) +vld_list(NULL) +} +\seealso{ +\code{\link[=is.list]{is.list()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other data_structure_checkers: +\code{\link{chk_array}()}, +\code{\link{chk_atomic}()}, +\code{\link{chk_matrix}()}, +\code{\link{chk_vector}()} +} +\concept{data_structure_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_logical.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_logical.Rd new file mode 100644 index 00000000..72549afb --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_logical.Rd @@ -0,0 +1,73 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-logical.R +\name{chk_logical} +\alias{chk_logical} +\alias{vld_logical} +\title{Check Logical} +\usage{ +chk_logical(x, x_name = NULL) + +vld_logical(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 logical using + +\code{is.logical(x)} + +If you want to check if it is a scalar, +meaning that in addition to being of logical type, +it has \code{length(x) == 1}, you should use \code{\link[=chk_lgl]{chk_lgl()}} +} +\section{Functions}{ +\itemize{ +\item \code{vld_logical()}: Validate Logical + +}} +\examples{ +# chk_logical +chk_logical(TRUE) +try(chk_logical(1)) +# vld_logical +vld_logical(TRUE) +vld_logical(matrix(TRUE)) +vld_logical(logical(0)) +vld_logical(NA) +vld_logical(1) +vld_logical("TRUE") +} +\seealso{ +\code{\link[=is.logical]{is.logical()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other logical_checkers: +\code{\link{chk_false}()}, +\code{\link{chk_flag}()}, +\code{\link{chk_lgl}()}, +\code{\link{chk_true}()} + +Other data_type_checkers: +\code{\link{chk_character}()}, +\code{\link{chk_character_or_factor}()}, +\code{\link{chk_complex}()}, +\code{\link{chk_double}()}, +\code{\link{chk_environment}()}, +\code{\link{chk_integer}()}, +\code{\link{chk_numeric}()}, +\code{\link{chk_raw}()} +} +\concept{data_type_checkers} +\concept{logical_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_lt.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_lt.Rd new file mode 100644 index 00000000..49d0a195 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_lt.Rd @@ -0,0 +1,61 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-lt.R +\name{chk_lt} +\alias{chk_lt} +\alias{vld_lt} +\title{Check Less Than} +\usage{ +chk_lt(x, value = 0, x_name = NULL) + +vld_lt(x, value = 0) +} +\arguments{ +\item{x}{The object to check.} + +\item{value}{A non-missing scalar of a value.} + +\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 non-missing values are less than value using + +\code{all(x[!is.na(x)] < value)} +} +\section{Functions}{ +\itemize{ +\item \code{vld_lt()}: Validate Less Than + +}} +\examples{ +# chk_lt +chk_lt(-0.1) +try(chk_lt(c(-0.1, 0.2))) +# vld_lt +vld_lt(numeric(0)) +vld_lt(0) +vld_lt(-0.1) +vld_lt(c(-0.1, -0.2, NA)) +vld_lt(c(-0.1, 0.2)) +vld_lt(c(-0.1, 0.2), value = 1) +vld_lt("a", value = "b") +} +\seealso{ +\code{\link[=all]{all()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other range_checkers: +\code{\link{chk_gt}()}, +\code{\link{chk_gte}()}, +\code{\link{chk_lte}()}, +\code{\link{chk_range}()} +} +\concept{range_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_lte.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_lte.Rd new file mode 100644 index 00000000..c35b53d6 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_lte.Rd @@ -0,0 +1,59 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-lte.R +\name{chk_lte} +\alias{chk_lte} +\alias{vld_lte} +\title{Check Less Than or Equal To} +\usage{ +chk_lte(x, value = 0, x_name = NULL) + +vld_lte(x, value = 0) +} +\arguments{ +\item{x}{The object to check.} + +\item{value}{A non-missing scalar of a value.} + +\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 non-missing values are less than or equal to y using + +\code{all(x[!is.na(x)] <= value)} +} +\section{Functions}{ +\itemize{ +\item \code{vld_lte()}: Validate Less Than or Equal To + +}} +\examples{ +# chk_lte +chk_lte(0) +try(chk_lte(0.1)) +# vld_lte +vld_lte(numeric(0)) +vld_lte(0) +vld_lte(0.1) +vld_lte(c(-0.1, -0.2, NA)) +vld_lte(c(-0.1, -0.2, NA), value = -1) +} +\seealso{ +\code{\link[=all]{all()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other range_checkers: +\code{\link{chk_gt}()}, +\code{\link{chk_gte}()}, +\code{\link{chk_lt}()}, +\code{\link{chk_range}()} +} +\concept{range_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_match.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_match.Rd new file mode 100644 index 00000000..740e72e4 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_match.Rd @@ -0,0 +1,55 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-match.R +\name{chk_match} +\alias{chk_match} +\alias{vld_match} +\title{Check Matches} +\usage{ +chk_match(x, regexp = ".+", x_name = NULL) + +vld_match(x, regexp = ".+") +} +\arguments{ +\item{x}{The object to check.} + +\item{regexp}{A string of a regular expression.} + +\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 values match regular expression using + +\code{all(grepl(regexp, x[!is.na(x)]))} +} +\section{Functions}{ +\itemize{ +\item \code{vld_match()}: Validate Matches + +}} +\examples{ +# chk_match +chk_match("1") +try(chk_match("1", regexp = "2")) +# vld_match +vld_match("1") +vld_match("a", regexp = "a") +vld_match("") +vld_match("1", regexp = "2") +vld_match(NA_character_, regexp = ".*") +} +\seealso{ +\code{\link[=all]{all()}} + +\code{\link[=grepl]{grepl()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. +} +\concept{regex_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_matrix.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_matrix.Rd new file mode 100644 index 00000000..10702d68 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_matrix.Rd @@ -0,0 +1,54 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-matrix.R +\name{chk_matrix} +\alias{chk_matrix} +\alias{vld_matrix} +\title{Check Matrix} +\usage{ +chk_matrix(x, x_name = NULL) + +vld_matrix(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 is a matrix using + +\code{is.matrix(x)} +} +\section{Functions}{ +\itemize{ +\item \code{vld_matrix()}: Validate Matrix + +}} +\examples{ +# chk_matrix +chk_matrix(matrix(1)) +try(chk_matrix(array(1))) +# vld_matrix +vld_matrix(1) +vld_matrix(matrix(1)) +} +\seealso{ +\code{\link[=is.matrix]{is.matrix()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other data_structure_checkers: +\code{\link{chk_array}()}, +\code{\link{chk_atomic}()}, +\code{\link{chk_list}()}, +\code{\link{chk_vector}()} +} +\concept{data_structure_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_missing.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_missing.Rd new file mode 100644 index 00000000..c896d226 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_missing.Rd @@ -0,0 +1,62 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-missing.R +\name{chk_missing} +\alias{chk_missing} +\alias{vld_missing} +\title{Check Missing Argument} +\usage{ +chk_missing(x, x_name = NULL) + +vld_missing(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 argument missing using + +\code{missing(x)} +} +\details{ +Currently only checks if value is available +(as opposed to whether it was specified). +} +\section{Functions}{ +\itemize{ +\item \code{vld_missing()}: Validate Missing Argument + +}} +\examples{ +# chk_missing +fun <- function(x) { + chk_missing(x) +} +fun() +try(fun(1)) +# vld_missing +fun <- function(x) { + vld_missing(x) +} +fun() +fun(1) +} +\seealso{ +\code{\link[=missing]{missing()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other missing_checkers: +\code{\link{chk_function}()}, +\code{\link{chk_not_missing}()} +} +\concept{missing_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_named.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_named.Rd new file mode 100644 index 00000000..b62fdf32 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_named.Rd @@ -0,0 +1,57 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-named.R +\name{chk_named} +\alias{chk_named} +\alias{vld_named} +\title{Check Named} +\usage{ +chk_named(x, x_name = NULL) + +vld_named(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 is named using + +\code{!is.null(names(x))} +} +\section{Functions}{ +\itemize{ +\item \code{vld_named()}: Validate Named + +}} +\examples{ +# chk_named +chk_named(c(x = 1)) +try(chk_named(list(1))) +# vld_named +vld_named(c(x = 1)) +vld_named(list(x = 1)) +vld_named(c(x = 1)[-1]) +vld_named(list(x = 1)[-1]) +vld_named(1) +vld_named(list(1)) +} +\seealso{ +\code{\link[=names]{names()}} + +\code{\link[=is.null]{is.null()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other name_checkers: +\code{\link{chk_valid_name}()} +} +\concept{name_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_not_any_na.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_not_any_na.Rd new file mode 100644 index 00000000..434be614 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_not_any_na.Rd @@ -0,0 +1,59 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-not-any-na.R +\name{chk_not_any_na} +\alias{chk_not_any_na} +\alias{vld_not_any_na} +\title{Check Not Any Missing Values} +\usage{ +chk_not_any_na(x, x_name = NULL) + +vld_not_any_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 not any missing values using + +\code{!anyNA(x)} + +\strong{Pass}: \code{1}, \code{1:2}, \code{"1"}, \code{logical(0)}. + +\strong{Fail}: \code{NA}, \code{c(1, NA)}. +} +\section{Functions}{ +\itemize{ +\item \code{vld_not_any_na()}: Validate Not Any Missing Values + +}} +\examples{ +# chk_not_any_na +chk_not_any_na(1) +try(chk_not_any_na(NA)) +# vld_not_any_na +vld_not_any_na(1) +vld_not_any_na(1:2) +vld_not_any_na(NA_real_) +vld_not_any_na(integer(0)) +vld_not_any_na(c(NA, 1)) +vld_not_any_na(TRUE) +} +\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}()}, +\code{\link{chk_not_empty}()}, +\code{\link{chk_unique}()} +} +\concept{misc_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_not_empty.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_not_empty.Rd new file mode 100644 index 00000000..c40cabd1 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_not_empty.Rd @@ -0,0 +1,61 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-not-empty.R +\name{chk_not_empty} +\alias{chk_not_empty} +\alias{vld_not_empty} +\title{Check Not Empty} +\usage{ +chk_not_empty(x, x_name = NULL) + +vld_not_empty(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 not empty using + +\code{length(x) != 0L} + +\strong{Pass}: \code{1}, \code{1:2}, \code{NA}, \code{matrix(1:3)}, \code{list(1)}, \code{data.frame(x = 1)}. + +\strong{Fail}: \code{NULL}, \code{logical(0)}, \code{list()}, \code{data.frame()}. +} +\section{Functions}{ +\itemize{ +\item \code{vld_not_empty()}: Validate Not Empty + +}} +\examples{ +# chk_not_empty +chk_not_empty(1) +try(chk_not_empty(numeric(0))) +# vld_not_empty +vld_not_empty(1) +vld_not_empty(matrix(1:3)) +vld_not_empty(character(0)) +vld_not_empty(list(1)) +vld_not_empty(NULL) +vld_not_empty(list()) +} +\seealso{ +\code{\link[=length]{length()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other misc_checkers: +\code{\link{chk_join}()}, +\code{\link{chk_not_any_na}()}, +\code{\link{chk_unique}()} +} +\concept{misc_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_not_missing.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_not_missing.Rd new file mode 100644 index 00000000..f8535e44 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_not_missing.Rd @@ -0,0 +1,62 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-not-missing.R +\name{chk_not_missing} +\alias{chk_not_missing} +\alias{vld_not_missing} +\title{Check Not Missing Argument} +\usage{ +chk_not_missing(x, x_name = "`x`") + +vld_not_missing(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 argument not missing using + +\code{!missing(x)} +} +\details{ +Currently only checks if value is available +(as opposed to whether it was specified). +} +\section{Functions}{ +\itemize{ +\item \code{vld_not_missing()}: Validate Not Missing Argument + +}} +\examples{ +# chk_not_missing +fun <- function(x) { + chk_not_missing(x) +} +fun(1) +try(fun()) +# vld_not_missing +fun <- function(x) { + vld_not_missing(x) +} +fun() +fun(1) +} +\seealso{ +\code{\link[=missing]{missing()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other missing_checkers: +\code{\link{chk_function}()}, +\code{\link{chk_missing}()} +} +\concept{missing_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_not_null.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_not_null.Rd new file mode 100644 index 00000000..0643ba94 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_not_null.Rd @@ -0,0 +1,51 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-not-null.R +\name{chk_not_null} +\alias{chk_not_null} +\alias{vld_not_null} +\title{Check not NULL} +\usage{ +chk_not_null(x, x_name = NULL) + +vld_not_null(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 not NULL using + +\code{!is.null(x)} +} +\section{Functions}{ +\itemize{ +\item \code{vld_not_null()}: Validate Not NULL + +}} +\examples{ +# chk_not_null +try(chk_not_null(NULL)) +chk_not_null(1) +# vld_not_null +vld_not_null(1) +vld_not_null(NULL) +} +\seealso{ +\code{\link[=is.null]{is.null()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other null_checkers: +\code{\link{chk_null}()} +} +\concept{null_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_not_subset.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_not_subset.Rd new file mode 100644 index 00000000..4fb2c29a --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_not_subset.Rd @@ -0,0 +1,47 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-not-subset.R +\name{chk_not_subset} +\alias{chk_not_subset} +\title{Check Not Subset} +\usage{ +chk_not_subset(x, values, x_name = NULL) +} +\arguments{ +\item{x}{The object to check.} + +\item{values}{A vector of the permitted values.} + +\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 not all values in values using + +\code{!any(x \%in\% values) || !length(x)} +} +\examples{ +# chk_not_subset +chk_not_subset(11, 1:10) +try(chk_not_subset(1, 1:10)) +} +\seealso{ +\code{\link[=any]{any()}} + +\code{\link[=length]{length()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other set_checkers: +\code{\link{chk_orderset}()}, +\code{\link{chk_superset}()}, +\code{\link{vld_not_subset}()}, +\code{\link{vld_orderset}()} +} +\concept{set_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_null.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_null.Rd new file mode 100644 index 00000000..bf2d99d6 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_null.Rd @@ -0,0 +1,51 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-null.R +\name{chk_null} +\alias{chk_null} +\alias{vld_null} +\title{Check NULL} +\usage{ +chk_null(x, x_name = NULL) + +vld_null(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 NULL using + +\code{is.null(x)} +} +\section{Functions}{ +\itemize{ +\item \code{vld_null()}: Validate NULL + +}} +\examples{ +# chk_null +try(chk_null(1)) +chk_null(NULL) +# vld_null +vld_null(NULL) +vld_null(1) +} +\seealso{ +\code{\link[=is.null]{is.null()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other null_checkers: +\code{\link{chk_not_null}()} +} +\concept{null_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_null_or.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_null_or.Rd new file mode 100644 index 00000000..dfd6fbde --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_null_or.Rd @@ -0,0 +1,30 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-null-or.R +\name{chk_null_or} +\alias{chk_null_or} +\title{Check NULL Or} +\usage{ +chk_null_or(x, chk, ..., vld, x_name = NULL) +} +\arguments{ +\item{x}{The object to check.} + +\item{chk}{A chk function. Soft-deprecated for vld. \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}}} + +\item{...}{Arguments passed to chk.} + +\item{vld}{A vld function.} + +\item{x_name}{A string of the name of object x or NULL.} +} +\value{ +An informative error if the test fails. +} +\description{ +Checks if NULL or passes test. +} +\examples{ +chk_null_or(NULL, chk_number) +chk_null_or(1, chk_number) +try(chk_null_or("1", chk_number)) +} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_number.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_number.Rd new file mode 100644 index 00000000..fcda933d --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_number.Rd @@ -0,0 +1,53 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-number.R +\name{chk_number} +\alias{chk_number} +\alias{vld_number} +\title{Check Number} +\usage{ +chk_number(x, x_name = NULL) + +vld_number(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 non-missing numeric scalar using + +\code{is.numeric(x) && length(x) == 1L && !anyNA(x)} + +\strong{Pass}: \code{1}, \code{2L}, \code{log(10)}, \code{-Inf} + +\strong{Fail}: \code{"a"}, \code{1:3}, \code{NA_real_} +} +\section{Functions}{ +\itemize{ +\item \code{vld_number()}: Validate Number + +}} +\examples{ +# chk_number +chk_number(1.1) +try(chk_number(TRUE)) +# vld_number +vld_number(1.1) +} +\seealso{ +\code{\link[=is.numeric]{is.numeric()}} + +\code{\link[=length]{length()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. +} +\concept{data_type_checkers scalar_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_numeric.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_numeric.Rd new file mode 100644 index 00000000..d236f345 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_numeric.Rd @@ -0,0 +1,66 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-numeric.R +\name{chk_numeric} +\alias{chk_numeric} +\alias{vld_numeric} +\title{Check Numeric} +\usage{ +chk_numeric(x, x_name = NULL) + +vld_numeric(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 numeric using + +\code{is.numeric(x)} + +\strong{Pass}: \code{1}, \code{1:2}, \code{NA_real_}, \code{integer(0)}, \code{matrix(1:3)}. + +\strong{Fail}: \code{TRUE}, \code{"1"}, \code{NA}, \code{NULL}. +} +\section{Functions}{ +\itemize{ +\item \code{vld_numeric()}: Validate Numeric + +}} +\examples{ +# chk_numeric +chk_numeric(1) +try(chk_numeric("1")) +# vld_numeric +vld_numeric(1) +vld_numeric(1:2) +vld_numeric(NA_real_) +vld_numeric(integer(0)) +vld_numeric("1") +vld_numeric(TRUE) +} +\seealso{ +\code{\link[=is.numeric]{is.numeric()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other data_type_checkers: +\code{\link{chk_character}()}, +\code{\link{chk_character_or_factor}()}, +\code{\link{chk_complex}()}, +\code{\link{chk_double}()}, +\code{\link{chk_environment}()}, +\code{\link{chk_integer}()}, +\code{\link{chk_logical}()}, +\code{\link{chk_raw}()} +} +\concept{data_type_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_orderset.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_orderset.Rd new file mode 100644 index 00000000..eb8d3283 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_orderset.Rd @@ -0,0 +1,47 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-orderset.R +\name{chk_orderset} +\alias{chk_orderset} +\title{Check Set Ordered} +\usage{ +chk_orderset(x, values, x_name = NULL) +} +\arguments{ +\item{x}{The object to check.} + +\item{values}{A vector of the permitted values.} + +\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. + +The \code{vld_} function returns a flag indicating whether the test was met. +} +\description{ +Checks if the first occurrence of each shared element +in x is equivalent to the first occurrence of each shared element in values using +\code{vld_equivalent(unique(x[x \%in\% values]), values[values \%in\% x])}. +} +\examples{ + +# chk_orderset +chk_orderset(1:2, 1:2) +try(chk_orderset(2:1, 1:2)) +} +\seealso{ +\code{\link[=vld_equivalent]{vld_equivalent()}} + +\code{\link[=unique]{unique()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other set_checkers: +\code{\link{chk_not_subset}()}, +\code{\link{chk_superset}()}, +\code{\link{vld_not_subset}()}, +\code{\link{vld_orderset}()} +} +\concept{set_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_range.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_range.Rd new file mode 100644 index 00000000..68f00141 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_range.Rd @@ -0,0 +1,68 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-range.R +\name{chk_range} +\alias{chk_range} +\alias{vld_range} +\title{Checks range of non-missing values} +\usage{ +chk_range(x, range = c(0, 1), inclusive = TRUE, x_name = NULL) + +vld_range(x, range = c(0, 1), inclusive = TRUE) +} +\arguments{ +\item{x}{The object to check.} + +\item{range}{A non-missing sorted vector of length 2 of the lower and +upper permitted values.} + +\item{inclusive}{A flag specifying whether the range is exclusive.} + +\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 all non-missing values fall within range using + +If inclusive + +\code{all(x[!is.na(x)] >= range[1] & x[!is.na(x)] <= range[2])} + +else + +\code{all(x[!is.na(x)] > range[1] & x[!is.na(x)] < range[2])} +} +\section{Functions}{ +\itemize{ +\item \code{vld_range()}: Validate Range + +}} +\examples{ +# chk_range +chk_range(0) +try(chk_range(-0.1)) +# vld_range +vld_range(numeric(0)) +vld_range(0) +vld_range(-0.1) +vld_range(c(0.1, 0.2, NA)) +vld_range(c(0.1, 0.2, NA), range = c(0, 1)) +} +\seealso{ +\code{\link[=all]{all()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other range_checkers: +\code{\link{chk_gt}()}, +\code{\link{chk_gte}()}, +\code{\link{chk_lt}()}, +\code{\link{chk_lte}()} +} +\concept{range_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_raw.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_raw.Rd new file mode 100644 index 00000000..8210f81c --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_raw.Rd @@ -0,0 +1,60 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-raw.R +\name{chk_raw} +\alias{chk_raw} +\alias{vld_raw} +\title{Check Raw} +\usage{ +chk_raw(x, x_name = NULL) + +vld_raw(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 raw using + +\code{is.raw(x)} +} +\section{Functions}{ +\itemize{ +\item \code{vld_raw()}: Validate Raw + +}} +\examples{ +# chk_raw +chk_raw(as.raw(1)) +try(chk_raw(1)) +# vld_raw +vld_raw(as.raw(1)) +vld_raw(raw(0)) +vld_raw(1) +vld_raw(TRUE) +} +\seealso{ +\code{\link[=is.raw]{is.raw()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other data_type_checkers: +\code{\link{chk_character}()}, +\code{\link{chk_character_or_factor}()}, +\code{\link{chk_complex}()}, +\code{\link{chk_double}()}, +\code{\link{chk_environment}()}, +\code{\link{chk_integer}()}, +\code{\link{chk_logical}()}, +\code{\link{chk_numeric}()} +} +\concept{data_type_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_s3_class.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_s3_class.Rd new file mode 100644 index 00000000..10cc6f72 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_s3_class.Rd @@ -0,0 +1,55 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-s3-class.R +\name{chk_s3_class} +\alias{chk_s3_class} +\alias{vld_s3_class} +\title{Check Type} +\usage{ +chk_s3_class(x, class, x_name = NULL) + +vld_s3_class(x, class) +} +\arguments{ +\item{x}{The object to check.} + +\item{class}{A character vector specifying the possible class values.} + +\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 inherits from S3 class using + +\code{!isS4(x) && inherits(x, class)} +} +\section{Functions}{ +\itemize{ +\item \code{vld_s3_class()}: Validate Inherits from S3 Class + +}} +\examples{ +# chk_s3_class +chk_s3_class(1, "numeric") +try(chk_s3_class(getClass("MethodDefinition"), "classRepresentation")) +# vld_s3_class +vld_s3_class(numeric(0), "numeric") +vld_s3_class(getClass("MethodDefinition"), "classRepresentation") +} +\seealso{ +\code{\link[=inherits]{inherits()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other id_checkers: +\code{\link{chk_data}()}, +\code{\link{chk_is}()}, +\code{\link{chk_s4_class}()} +} +\concept{id_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_s4_class.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_s4_class.Rd new file mode 100644 index 00000000..a62bec3d --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_s4_class.Rd @@ -0,0 +1,55 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-s4-class.R +\name{chk_s4_class} +\alias{chk_s4_class} +\alias{vld_s4_class} +\title{Check Inherits from S4 Class} +\usage{ +chk_s4_class(x, class, x_name = NULL) + +vld_s4_class(x, class) +} +\arguments{ +\item{x}{The object to check.} + +\item{class}{A character vector specifying the possible class values.} + +\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 inherits from S4 class using + +\code{isS4(x) && methods::is(x, class)} +} +\section{Functions}{ +\itemize{ +\item \code{vld_s4_class()}: Validate Inherits from S4 Class + +}} +\examples{ +# chk_s4_class +try(chk_s4_class(1, "numeric")) +chk_s4_class(getClass("MethodDefinition"), "classRepresentation") +# vld_s4_class +vld_s4_class(numeric(0), "numeric") +vld_s4_class(getClass("MethodDefinition"), "classRepresentation") +} +\seealso{ +\code{\link[methods:is]{methods::is()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other id_checkers: +\code{\link{chk_data}()}, +\code{\link{chk_is}()}, +\code{\link{chk_s3_class}()} +} +\concept{id_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_scalar.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_scalar.Rd new file mode 100644 index 00000000..dda11fdb --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_scalar.Rd @@ -0,0 +1,59 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-scalar.R +\name{chk_scalar} +\alias{chk_scalar} +\alias{vld_scalar} +\title{Check Scalar} +\usage{ +chk_scalar(x, x_name = NULL) + +vld_scalar(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 is a vector using + +\code{length(x) == 1L} +} +\section{Functions}{ +\itemize{ +\item \code{vld_scalar()}: Validate Scalar + +}} +\examples{ +# chk_scalar +chk_scalar(1) +chk_scalar(list(1)) +try(chk_scalar(1:2)) +# vld_scalar +vld_scalar(1) +} +\seealso{ +\code{\link[=length]{length()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other scalar_checkers: +\code{\link{chk_count}()}, +\code{\link{chk_date}()}, +\code{\link{chk_date_time}()}, +\code{\link{chk_false}()}, +\code{\link{chk_flag}()}, +\code{\link{chk_lgl}()}, +\code{\link{chk_string}()}, +\code{\link{chk_true}()}, +\code{\link{chk_tz}()} +} +\concept{scalar_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_setequal.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_setequal.Rd new file mode 100644 index 00000000..c5a83d13 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_setequal.Rd @@ -0,0 +1,69 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-orderset.R, R/chk-setequal.R +\name{vld_orderset} +\alias{vld_orderset} +\alias{chk_setequal} +\alias{vld_setequal} +\title{Check Set Equal} +\usage{ +vld_orderset(x, values) + +chk_setequal(x, values, x_name = NULL) + +vld_setequal(x, values) +} +\arguments{ +\item{x}{The object to check.} + +\item{values}{A vector of the permitted values.} + +\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 equal set using + +\code{setequal(x, values)} +} +\section{Functions}{ +\itemize{ +\item \code{vld_orderset()}: Validate Set Ordered + +\item \code{vld_setequal()}: Validate Set Equal + +}} +\examples{ + +# vld_orderset +vld_orderset(1, 1) +vld_orderset(1:2, 2:1) +vld_orderset(1, 2:1) +vld_orderset(1:2, 2) +# chk_setequal +chk_setequal(1:2, 2:1) +try(chk_setequal(1, 1:2)) +# vld_setequal +vld_setequal(1, 1) +vld_setequal(1:2, 2:1) +vld_setequal(1, 2:1) +vld_setequal(1:2, 2) +} +\seealso{ +\code{\link[=setequal]{setequal()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other set_checkers: +\code{\link{chk_not_subset}()}, +\code{\link{chk_orderset}()}, +\code{\link{chk_superset}()}, +\code{\link{vld_not_subset}()} +} +\concept{set_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_sorted.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_sorted.Rd new file mode 100644 index 00000000..feffa663 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_sorted.Rd @@ -0,0 +1,48 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-sorted.R +\name{chk_sorted} +\alias{chk_sorted} +\alias{vld_sorted} +\title{Check Sorted} +\usage{ +chk_sorted(x, x_name = NULL) + +vld_sorted(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 is sorted using + +\code{is.unsorted(x, na.rm = TRUE)} +} +\section{Functions}{ +\itemize{ +\item \code{vld_sorted()}: Validate Sorted + +}} +\examples{ +# chk_sorted +chk_sorted(1:2) +try(chk_sorted(2:1)) +# vld_sorted +vld_sorted(1:2) +vld_sorted(2:1) +} +\seealso{ +\code{\link[=is.unsorted]{is.unsorted()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. +} +\concept{sorted_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_string.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_string.Rd new file mode 100644 index 00000000..5c467ad7 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_string.Rd @@ -0,0 +1,62 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-string.R +\name{chk_string} +\alias{chk_string} +\alias{vld_string} +\title{Check String} +\usage{ +chk_string(x, x_name = NULL) + +vld_string(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 string + +\code{is.character(x) && length(x) == 1L && !anyNA(x)} +} +\section{Functions}{ +\itemize{ +\item \code{vld_string()}: Validate String + +}} +\examples{ +# chk_string +chk_string("1") +try(chk_string(1)) +# vld_string +vld_string("1") +vld_string("") +vld_string(1) +vld_string(NA_character_) +vld_string(c("1", "1")) +} +\seealso{ +\code{\link[=length]{length()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other scalar_checkers: +\code{\link{chk_count}()}, +\code{\link{chk_date}()}, +\code{\link{chk_date_time}()}, +\code{\link{chk_false}()}, +\code{\link{chk_flag}()}, +\code{\link{chk_lgl}()}, +\code{\link{chk_scalar}()}, +\code{\link{chk_true}()}, +\code{\link{chk_tz}()} +} +\concept{scalar_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_subset.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_subset.Rd new file mode 100644 index 00000000..893fba2a --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_subset.Rd @@ -0,0 +1,69 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-not-subset.R, R/chk-subset.R +\name{vld_not_subset} +\alias{vld_not_subset} +\alias{chk_subset} +\alias{vld_subset} +\title{Check Subset} +\usage{ +vld_not_subset(x, values) + +chk_subset(x, values, x_name = NULL) + +vld_subset(x, values) +} +\arguments{ +\item{x}{The object to check.} + +\item{values}{A vector of the permitted values.} + +\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 values in values using + +\code{all(x \%in\% values)} + +Pay attention to the order of the arguments \code{value} and \code{x} +in this function compared to \code{\link[=chk_superset]{chk_superset()}} +} +\section{Functions}{ +\itemize{ +\item \code{vld_not_subset()}: Validate Not Subset + +\item \code{vld_subset()}: Validate Subset + +}} +\examples{ +# vld_not_subset +vld_not_subset(numeric(0), 1:10) +vld_not_subset(1, 1:10) +vld_not_subset(11, 1:10) +# chk_subset +chk_subset(1, 1:10) +try(chk_subset(11, 1:10)) +# vld_subset +vld_subset(numeric(0), 1:10) +vld_subset(1, 1:10) +vld_subset(11, 1:10) +} +\seealso{ +\code{\link[=all]{all()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other set_checkers: +\code{\link{chk_not_subset}()}, +\code{\link{chk_orderset}()}, +\code{\link{chk_superset}()}, +\code{\link{vld_orderset}()} +} +\concept{set_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_superset.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_superset.Rd new file mode 100644 index 00000000..ade995d3 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_superset.Rd @@ -0,0 +1,60 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-superset.R +\name{chk_superset} +\alias{chk_superset} +\alias{vld_superset} +\title{Check Superset} +\usage{ +chk_superset(x, values, x_name = NULL) + +vld_superset(x, values) +} +\arguments{ +\item{x}{The object to check.} + +\item{values}{A vector of the permitted values.} + +\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 includes all values using + +\code{all(values \%in\% x)} + +Pay attention to the order of the arguments \code{value} and \code{x} +in this function compared to \code{\link[=chk_subset]{chk_subset()}} +} +\section{Functions}{ +\itemize{ +\item \code{vld_superset()}: Validates Superset + +}} +\examples{ +# chk_superset +chk_superset(1:3, 1) +try(chk_superset(1:3, 4)) +# vld_superset +vld_superset(1:3, 1) +vld_superset(1:3, 4) +vld_superset(integer(0), integer(0)) +} +\seealso{ +\code{\link[=all]{all()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other set_checkers: +\code{\link{chk_not_subset}()}, +\code{\link{chk_orderset}()}, +\code{\link{vld_not_subset}()}, +\code{\link{vld_orderset}()} +} +\concept{set_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_true.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_true.Rd new file mode 100644 index 00000000..0ef8c0aa --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_true.Rd @@ -0,0 +1,71 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-true.R +\name{chk_true} +\alias{chk_true} +\alias{vld_true} +\title{Check TRUE} +\usage{ +chk_true(x, x_name = NULL) + +vld_true(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 TRUE using + +\code{is.logical(x) && length(x) == 1L && !anyNA(x) && x} +} +\section{Functions}{ +\itemize{ +\item \code{vld_true()}: Validate TRUE + +}} +\examples{ +# chk_true +chk_true(TRUE) +try(chk_true(1)) +# vld_true +vld_true(TRUE) +vld_true(FALSE) +vld_true(NA) +vld_true(0) +vld_true(c(TRUE, TRUE)) +} +\seealso{ +\code{\link[=is.logical]{is.logical()}} + +\code{\link[=length]{length()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other logical_checkers: +\code{\link{chk_false}()}, +\code{\link{chk_flag}()}, +\code{\link{chk_lgl}()}, +\code{\link{chk_logical}()} + +Other scalar_checkers: +\code{\link{chk_count}()}, +\code{\link{chk_date}()}, +\code{\link{chk_date_time}()}, +\code{\link{chk_false}()}, +\code{\link{chk_flag}()}, +\code{\link{chk_lgl}()}, +\code{\link{chk_scalar}()}, +\code{\link{chk_string}()}, +\code{\link{chk_tz}()} +} +\concept{logical_checkers} +\concept{scalar_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_tz.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_tz.Rd new file mode 100644 index 00000000..a3f9c2c1 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_tz.Rd @@ -0,0 +1,63 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-tz.R +\name{chk_tz} +\alias{chk_tz} +\alias{vld_tz} +\title{Check Time Zone} +\usage{ +chk_tz(x, x_name = NULL) + +vld_tz(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 non-missing valid scalar timezone using + +\code{is.character(x) && length(x) == 1L && !anyNA(x) && x \%in\% OlsonNames()} +} +\section{Functions}{ +\itemize{ +\item \code{vld_tz()}: Validate Time Zone + +}} +\examples{ +chk_tz("UTC") +try(chk_tz("TCU")) +vld_tz("UTC") +vld_tz("TCU") +} +\seealso{ +\code{\link[=length]{length()}} + +\code{\link[=OlsonNames]{OlsonNames()}} + +\code{\link[=is.character]{is.character()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other scalar_checkers: +\code{\link{chk_count}()}, +\code{\link{chk_date}()}, +\code{\link{chk_date_time}()}, +\code{\link{chk_false}()}, +\code{\link{chk_flag}()}, +\code{\link{chk_lgl}()}, +\code{\link{chk_scalar}()}, +\code{\link{chk_string}()}, +\code{\link{chk_true}()} +} +\concept{date_checkers} +\concept{scalar_checkers} +\concept{tz_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_unique.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_unique.Rd new file mode 100644 index 00000000..8d534125 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_unique.Rd @@ -0,0 +1,60 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-unique.R +\name{chk_unique} +\alias{chk_unique} +\alias{vld_unique} +\title{Check Unique} +\usage{ +chk_unique(x, incomparables = FALSE, x_name = NULL) + +vld_unique(x, incomparables = FALSE) +} +\arguments{ +\item{x}{The object to check.} + +\item{incomparables}{A vector of values that cannot be compared. +FALSE means that all values can be compared.} + +\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 unique using + +\code{!anyDuplicated(x, incomparables = incomparables)} +} +\section{Functions}{ +\itemize{ +\item \code{vld_unique()}: Validate Unique + +}} +\examples{ +# chk_unique +chk_unique(c(NA, 2)) +try(chk_unique(c(NA, NA, 2))) +chk_unique(c(NA, NA, 2), incomparables = NA) +# vld_unique +vld_unique(NULL) +vld_unique(numeric(0)) +vld_unique(c(NA, 2)) +vld_unique(c(NA, NA, 2)) +vld_unique(c(NA, NA, 2), incomparables = NA) +} +\seealso{ +\code{\link[=anyDuplicated]{anyDuplicated()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other misc_checkers: +\code{\link{chk_join}()}, +\code{\link{chk_not_any_na}()}, +\code{\link{chk_not_empty}()} +} +\concept{misc_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_unused.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_unused.Rd new file mode 100644 index 00000000..ae1465e8 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_unused.Rd @@ -0,0 +1,53 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-unused.R +\name{chk_unused} +\alias{chk_unused} +\alias{vld_unused} +\title{Check ... Unused} +\usage{ +chk_unused(...) + +vld_unused(...) +} +\arguments{ +\item{...}{Additional arguments.} +} +\value{ +The \code{chk_} function throws an informative error if the test fails. +} +\description{ +Checks if ... is unused + +\code{length(list(...)) == 0L} +} +\section{Functions}{ +\itemize{ +\item \code{vld_unused()}: Validate ... Unused + +}} +\examples{ +# chk_unused +fun <- function(x, ...) { + chk_unused(...) + x +} +fun(1) +try(fun(1, 2)) +# vld_unused +fun <- function(x, ...) { + vld_unused(...) +} +fun(1) +try(fun(1, 2)) +} +\seealso{ +\code{\link[=length]{length()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other ellipsis_checkers: +\code{\link{chk_used}()} +} +\concept{ellipsis_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_used.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_used.Rd new file mode 100644 index 00000000..59a78fd0 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_used.Rd @@ -0,0 +1,53 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-used.R +\name{chk_used} +\alias{chk_used} +\alias{vld_used} +\title{Check ... Used} +\usage{ +chk_used(...) + +vld_used(...) +} +\arguments{ +\item{...}{Additional arguments.} +} +\value{ +The \code{chk_} function throws an informative error if the test fails. +} +\description{ +Checks if is ... used using + +\code{length(list(...)) != 0L} +} +\section{Functions}{ +\itemize{ +\item \code{vld_used()}: Validate ... Used + +}} +\examples{ +# chk_used +fun <- function(x, ...) { + chk_used(...) + x +} +try(fun(1)) +fun(1, 2) +# vld_used +fun <- function(x, ...) { + vld_used(...) +} +fun(1) +fun(1, 2) +} +\seealso{ +\code{\link[=length]{length()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other ellipsis_checkers: +\code{\link{chk_unused}()} +} +\concept{ellipsis_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_valid_name.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_valid_name.Rd new file mode 100644 index 00000000..c711575a --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_valid_name.Rd @@ -0,0 +1,52 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-valid-name.R +\name{chk_valid_name} +\alias{chk_valid_name} +\alias{vld_valid_name} +\title{Check Valid Name} +\usage{ +chk_valid_name(x, x_name = NULL) + +vld_valid_name(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 valid name using + +\code{identical(make.names(x[!is.na(x)]), as.character(x[!is.na(x)]))} +} +\section{Functions}{ +\itemize{ +\item \code{vld_valid_name()}: Validate Valid Name + +}} +\examples{ +# chk_valid_name +chk_valid_name("text") +try(chk_valid_name(".1")) +# vld_valid_name +vld_valid_name(".1") +} +\seealso{ +\code{\link[=identical]{identical()}} + +\code{\link[=make.names]{make.names()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other name_checkers: +\code{\link{chk_named}()} +} +\concept{name_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_vector.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_vector.Rd new file mode 100644 index 00000000..c61d21ee --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_vector.Rd @@ -0,0 +1,58 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-vector.R +\name{chk_vector} +\alias{chk_vector} +\alias{vld_vector} +\title{Check Vector} +\usage{ +chk_vector(x, x_name = NULL) + +vld_vector(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 is a vector using + +\code{(is.atomic(x) && !is.matrix(x) && !is.array(x)) || is.list(x)} +} +\details{ +\code{is.vector(x)} is not reliable because it returns TRUE only +if the object is a vector with no attributes apart from names. +} +\section{Functions}{ +\itemize{ +\item \code{vld_vector()}: Validate Vector + +}} +\examples{ +# chk_vector +chk_vector(1) +chk_vector(list()) +try(chk_vector(matrix(1))) +# vld_vector +vld_vector(1) +} +\seealso{ +\code{\link[=is.atomic]{is.atomic()}}, \code{\link[=is.matrix]{is.matrix()}}, \code{\link[=is.array]{is.array()}}, \code{\link[=is.list]{is.list()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other data_structure_checkers: +\code{\link{chk_array}()}, +\code{\link{chk_atomic}()}, +\code{\link{chk_list}()}, +\code{\link{chk_matrix}()} +} +\concept{data_structure_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_whole_number.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_whole_number.Rd new file mode 100644 index 00000000..37dec314 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_whole_number.Rd @@ -0,0 +1,63 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-whole-number.R +\name{chk_whole_number} +\alias{chk_whole_number} +\alias{vld_whole_number} +\title{Check Whole Number} +\usage{ +chk_whole_number(x, x_name = NULL) + +vld_whole_number(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 non-missing integer scalar or double equivalent using + +\code{vld_number(x) && (is.integer(x) || vld_true(all.equal(x, trunc(x))))} + +\strong{Pass}: \code{1}, \code{2L}, \code{1e10}, \code{-Inf} + +\strong{Fail}: \code{"a"}, \code{1:3}, \code{NA_integer_}, \code{log(10)} +} +\section{Functions}{ +\itemize{ +\item \code{vld_whole_number()}: Validate Whole Number + +}} +\examples{ +# chk_whole_number +chk_whole_number(2) +try(chk_whole_number(1.1)) +# vld_whole_number +vld_whole_number(2) +} +\seealso{ +\code{\link[=is.integer]{is.integer()}} + +\code{\link[=vld_true]{vld_true()}} + +\code{\link[=vld_number]{vld_number()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other scalar_checker: +\code{\link{chk_complex_number}()} + +Other whole_number_checkers: +\code{\link{chk_count}()}, +\code{\link{chk_whole_numeric}()} +} +\concept{scalar_checker} +\concept{whole_number_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_whole_numeric.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_whole_numeric.Rd new file mode 100644 index 00000000..e7c95695 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_whole_numeric.Rd @@ -0,0 +1,62 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-whole-numeric.R +\name{chk_whole_numeric} +\alias{chk_whole_numeric} +\alias{vld_whole_numeric} +\title{Check Whole Numeric} +\usage{ +chk_whole_numeric(x, x_name = NULL) + +vld_whole_numeric(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 integer vector or double equivalent using + +\code{is.integer(x) || (is.double(x) && vld_true(all.equal(x, as.integer(x))))} +} +\section{Functions}{ +\itemize{ +\item \code{vld_whole_numeric()}: Validate Whole Numeric + +}} +\examples{ +# chk_whole_numeric +chk_whole_numeric(1) +try(chk_whole_numeric(1.1)) +# vld_whole_numeric +vld_whole_numeric(1) +vld_whole_numeric(NA_real_) +vld_whole_numeric(1:2) +vld_whole_numeric(double(0)) +vld_whole_numeric(TRUE) +vld_whole_numeric(1.5) +} +\seealso{ +\code{\link[=is.integer]{is.integer()}} + +\code{\link[=is.double]{is.double()}} + +\code{\link[=vld_true]{vld_true()}} + +\code{\link[=all.equal]{all.equal()}} + +For more details about the use of this function, +please read the article +\code{vignette("chk-families")}. + +Other whole_number_checkers: +\code{\link{chk_count}()}, +\code{\link{chk_whole_number}()} +} +\concept{whole_number_checkers} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chk_wnum.Rd b/chk.Rcheck/00_pkg_src/chk/man/chk_wnum.Rd new file mode 100644 index 00000000..5934aeeb --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chk_wnum.Rd @@ -0,0 +1,54 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chk-wnum.R +\name{chk_wnum} +\alias{chk_wnum} +\alias{vld_wnum} +\title{Check Whole Numeric Scalar} +\usage{ +chk_wnum(x, x_name = NULL) + +vld_wnum(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 whole numeric scalar using + +\code{is.numeric(x) && length(x) == 1L && (is.integer(x) || vld_true(all.equal(x, trunc(x))))} + +\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} +} +\section{Functions}{ +\itemize{ +\item \code{vld_wnum()}: Validate Whole Numeric Scalar + +\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} + +}} +\examples{ +# chk_wnum +chk_wnum(1) +try(chk_wnum(1.1)) +# vld_wnum +vld_wnum(1) +vld_wnum(double(0)) +vld_wnum(NA_real_) +vld_wnum(c(1, 1)) +vld_wnum(1L) +} +\seealso{ +Other deprecated: +\code{\link{chk_chr}()}, +\code{\link{chk_dbl}()}, +\code{\link{chk_deprecated}} +} +\concept{deprecated} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chkor.Rd b/chk.Rcheck/00_pkg_src/chk/man/chkor.Rd new file mode 100644 index 00000000..96fe5e29 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chkor.Rd @@ -0,0 +1,30 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chkor.R +\name{chkor} +\alias{chkor} +\title{Check OR} +\usage{ +chkor(...) +} +\arguments{ +\item{...}{Multiple \code{chk_} functions.} +} +\value{ +An informative error if the test fails. +} +\description{ +The \code{chkor()} function has been deprecated for the faster \code{chkor_vld()}. +} +\details{ +\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} +} +\examples{ +chkor() +chkor(chk_flag(TRUE)) +try(chkor(chk_flag(1))) +try(chkor(chk_flag(1), chk_flag(2))) +chkor(chk_flag(1), chk_flag(TRUE)) +} +\seealso{ +\code{\link[=chk_null_or]{chk_null_or()}} +} diff --git a/chk.Rcheck/00_pkg_src/chk/man/chkor_vld.Rd b/chk.Rcheck/00_pkg_src/chk/man/chkor_vld.Rd new file mode 100644 index 00000000..96991d53 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/chkor_vld.Rd @@ -0,0 +1,34 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chkor-vld.R +\name{chkor_vld} +\alias{chkor_vld} +\title{Chk OR} +\usage{ +chkor_vld(...) +} +\arguments{ +\item{...}{Multiple \code{vld_} calls. + +A common mistake is to pass \code{chk_} calls. + +\code{chkor_vld()} is relatively slow. +If at all possible use \code{\link[=chk_null_or]{chk_null_or()}} or first test using the individual +\code{vld_} functions and then call \code{chkor_vld()} to generate an informative +error message.} +} +\value{ +An informative error if the test fails. +} +\description{ +Chk OR +} +\examples{ +chkor_vld() +chkor_vld(vld_flag(TRUE)) +try(chkor_vld(vld_flag(1))) +try(chkor_vld(vld_flag(1), vld_flag(2))) +chkor_vld(vld_flag(1), vld_flag(TRUE)) +} +\seealso{ +\code{\link[=chk_null_or]{chk_null_or()}} +} diff --git a/chk.Rcheck/00_pkg_src/chk/man/deparse_backtick_chk.Rd b/chk.Rcheck/00_pkg_src/chk/man/deparse_backtick_chk.Rd new file mode 100644 index 00000000..ad60da3b --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/deparse_backtick_chk.Rd @@ -0,0 +1,43 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils.R +\name{deparse_backtick_chk} +\alias{deparse_backtick_chk} +\alias{backtick_chk} +\alias{unbacktick_chk} +\title{Deparse Backtick} +\usage{ +deparse_backtick_chk(x) + +backtick_chk(x) + +unbacktick_chk(x) +} +\arguments{ +\item{x}{A substituted object to deparse.} +} +\value{ +A string of the backticked substituted object. +} +\description{ +\code{deparse_backtick_chk} is a wrapper on \code{\link[=deparse]{deparse()}} +and \code{backtick_chk}. +} +\details{ +It is exported to allow users to easily construct their own \code{chk_} functions. +} +\section{Functions}{ +\itemize{ +\item \code{backtick_chk()}: Backtick + +\item \code{unbacktick_chk()}: Unbacktick + +}} +\examples{ + +# deparse_backtick_chk +deparse_backtick_chk(2) +deparse_backtick_chk(2^2) +} +\seealso{ +\code{\link[=deparse]{deparse()}} +} diff --git a/chk.Rcheck/00_pkg_src/chk/man/err.Rd b/chk.Rcheck/00_pkg_src/chk/man/err.Rd new file mode 100644 index 00000000..3a2e334f --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/err.Rd @@ -0,0 +1,77 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/err.R +\name{err} +\alias{err} +\alias{wrn} +\alias{msg} +\title{Stop, Warning and Message Messages} +\usage{ +err( + ..., + n = NULL, + tidy = TRUE, + .subclass = NULL, + class = NULL, + call = rlang::caller_call(3) +) + +wrn(..., n = NULL, tidy = TRUE, .subclass = NULL, class = NULL) + +msg(..., n = NULL, tidy = TRUE, .subclass = NULL, class = NULL) +} +\arguments{ +\item{...}{zero or more objects which can be coerced to character + (and which are pasted together with no separator) or a single + condition object.} + +\item{n}{The value of n for converting \code{sprintf}-like types.} + +\item{tidy}{A flag specifying whether capitalize the first character and add a missing period.} + +\item{.subclass}{A string of the class of the error message.} + +\item{class}{Subclass of the condition.} + +\item{call}{The execution environment of a currently running +function, e.g. \code{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 \code{call} when throwing a condition from a +helper function which wouldn't be relevant to mention in the +message. + +Can also be \code{NULL} or a \link[rlang:topic-defuse]{defused function call} to +respectively not display any call or hard-code a code to display. + +For more information about error calls, see \ifelse{html}{\link[rlang:topic-error-call]{Including function calls in error messages}}{\link[rlang:topic-error-call]{Including function calls in error messages}}.} +} +\description{ +The functions call \code{\link[=message_chk]{message_chk()}} to process +the message and then +\code{\link[rlang:abort]{rlang::abort()}}, \code{\link[rlang:abort]{rlang::warn()}} and +\code{\link[rlang:abort]{rlang::inform()}}, respectively. +} +\details{ +The user can set the subclass. +} +\section{Functions}{ +\itemize{ +\item \code{err()}: Error + +\item \code{wrn()}: Warning + +\item \code{msg()}: Message + +}} +\examples{ + +# err +try(err("there \%r \%n problem value\%s", n = 2)) + +# wrn +wrn("there \%r \%n problem value\%s", n = 2) + +# msg +msg("there \%r \%n problem value\%s", n = 2) +} diff --git a/chk.Rcheck/00_pkg_src/chk/man/expect_chk_error.Rd b/chk.Rcheck/00_pkg_src/chk/man/expect_chk_error.Rd new file mode 100644 index 00000000..91dee0c0 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/expect_chk_error.Rd @@ -0,0 +1,105 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/expect-chk-error.R +\name{expect_chk_error} +\alias{expect_chk_error} +\title{Expect Chk Error} +\usage{ +expect_chk_error( + object, + regexp = NULL, + ..., + info = NULL, + label = NULL, + class = NULL +) +} +\arguments{ +\item{object}{Object to test. + +Supports limited unquoting to make it easier to generate readable failures +within a function or for loop. See \link[testthat]{quasi_label} for more details.} + +\item{regexp}{Regular expression to test against. +\itemize{ +\item A character vector giving a regular expression that must match the +error message. +\item If \code{NULL}, the default, asserts that there should be an error, +but doesn't test for a specific value. +\item If \code{NA}, asserts that there should be no errors, but we now recommend +using \code{\link[testthat:expect_no_error]{expect_no_error()}} and friends instead. +} + +Note that you should only use \code{message} with errors/warnings/messages +that you generate. Avoid tests that rely on the specific text generated by +another package since this can easily change. If you do need to test text +generated by another package, either protect the test with \code{skip_on_cran()} +or use \code{expect_snapshot()}.} + +\item{...}{ + Arguments passed on to \code{\link[testthat:expect_match]{expect_match}} + \describe{ + \item{\code{fixed}}{If \code{TRUE}, treats \code{regexp} as a string to be matched exactly +(not a regular expressions). Overrides \code{perl}.} + \item{\code{perl}}{logical. Should Perl-compatible regexps be used?} + }} + +\item{info}{Extra information to be included in the message. This argument +is soft-deprecated and should not be used in new code. Instead see +alternatives in \link[testthat]{quasi_label}.} + +\item{label}{Used to customise failure messages. For expert use only.} + +\item{class}{Must be NULL.} +} +\value{ +If \code{regexp = NA}, the value of the first argument; otherwise +the captured condition. +} +\description{ +\code{\link[=expect_chk_error]{expect_chk_error()}} checks that code throws an error +of class \code{"chk_error"} with a message that matches regexp. +See below for more details. +} +\section{Testing \code{message} vs \code{class}}{ + + +When checking that code generates an error, it's important to check that the +error is the one you expect. There are two ways to do this. The first +way is the simplest: you just provide a \code{regexp} that match some fragment +of the error message. This is easy, but fragile, because the test will +fail if the error message changes (even if its the same error). + +A more robust way is to test for the class of the error, if it has one. +You can learn more about custom conditions at +\url{https://adv-r.hadley.nz/conditions.html#custom-conditions}, but in +short, errors are S3 classes and you can generate a custom class and check +for it using \code{class} instead of \code{regexp}. + +If you are using \code{expect_error()} to check that an error message is +formatted in such a way that it makes sense to a human, we recommend +using \code{\link[testthat:expect_snapshot]{expect_snapshot()}} instead. + +} + +\examples{ +expect_chk_error(chk_true(FALSE)) +try(expect_chk_error(chk_false(FALSE))) +} +\seealso{ +\code{\link[testthat:expect_no_error]{expect_no_error()}}, \code{expect_no_warning()}, +\code{expect_no_message()}, and \code{expect_no_condition()} to assert +that code runs without errors/warnings/messages/conditions. + +Other expectations: +\code{\link[testthat]{comparison-expectations}}, +\code{\link[testthat]{equality-expectations}}, +\code{\link[testthat]{expect_length}()}, +\code{\link[testthat]{expect_match}()}, +\code{\link[testthat]{expect_named}()}, +\code{\link[testthat]{expect_null}()}, +\code{\link[testthat]{expect_output}()}, +\code{\link[testthat]{expect_reference}()}, +\code{\link[testthat]{expect_silent}()}, +\code{\link[testthat]{inheritance-expectations}}, +\code{\link[testthat]{logical-expectations}} +} diff --git a/chk.Rcheck/00_pkg_src/chk/man/figures/lifecycle-archived.svg b/chk.Rcheck/00_pkg_src/chk/man/figures/lifecycle-archived.svg new file mode 100644 index 00000000..48f72a6f --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/figures/lifecycle-archived.svg @@ -0,0 +1 @@ + lifecyclelifecyclearchivedarchived \ No newline at end of file diff --git a/chk.Rcheck/00_pkg_src/chk/man/figures/lifecycle-defunct.svg b/chk.Rcheck/00_pkg_src/chk/man/figures/lifecycle-defunct.svg new file mode 100644 index 00000000..01452e5f --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/figures/lifecycle-defunct.svg @@ -0,0 +1 @@ +lifecyclelifecycledefunctdefunct \ No newline at end of file diff --git a/chk.Rcheck/00_pkg_src/chk/man/figures/lifecycle-deprecated.svg b/chk.Rcheck/00_pkg_src/chk/man/figures/lifecycle-deprecated.svg new file mode 100644 index 00000000..b61c57c3 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/figures/lifecycle-deprecated.svg @@ -0,0 +1,21 @@ + + lifecycle: deprecated + + + + + + + + + + + + + + + lifecycle + + deprecated + + diff --git a/chk.Rcheck/00_pkg_src/chk/man/figures/lifecycle-experimental.svg b/chk.Rcheck/00_pkg_src/chk/man/figures/lifecycle-experimental.svg new file mode 100644 index 00000000..5d88fc2c --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/figures/lifecycle-experimental.svg @@ -0,0 +1,21 @@ + + lifecycle: experimental + + + + + + + + + + + + + + + lifecycle + + experimental + + diff --git a/chk.Rcheck/00_pkg_src/chk/man/figures/lifecycle-maturing.svg b/chk.Rcheck/00_pkg_src/chk/man/figures/lifecycle-maturing.svg new file mode 100644 index 00000000..df713101 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/figures/lifecycle-maturing.svg @@ -0,0 +1 @@ +lifecyclelifecyclematuringmaturing \ No newline at end of file diff --git a/chk.Rcheck/00_pkg_src/chk/man/figures/lifecycle-questioning.svg b/chk.Rcheck/00_pkg_src/chk/man/figures/lifecycle-questioning.svg new file mode 100644 index 00000000..08ee0c90 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/figures/lifecycle-questioning.svg @@ -0,0 +1 @@ +lifecyclelifecyclequestioningquestioning \ No newline at end of file diff --git a/chk.Rcheck/00_pkg_src/chk/man/figures/lifecycle-retired.svg b/chk.Rcheck/00_pkg_src/chk/man/figures/lifecycle-retired.svg new file mode 100644 index 00000000..33f406b1 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/figures/lifecycle-retired.svg @@ -0,0 +1 @@ + lifecyclelifecycleretiredretired \ No newline at end of file diff --git a/chk.Rcheck/00_pkg_src/chk/man/figures/lifecycle-soft-deprecated.svg b/chk.Rcheck/00_pkg_src/chk/man/figures/lifecycle-soft-deprecated.svg new file mode 100644 index 00000000..9f014fd1 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/figures/lifecycle-soft-deprecated.svg @@ -0,0 +1 @@ +lifecyclelifecyclesoft-deprecatedsoft-deprecated \ No newline at end of file diff --git a/chk.Rcheck/00_pkg_src/chk/man/figures/lifecycle-stable.svg b/chk.Rcheck/00_pkg_src/chk/man/figures/lifecycle-stable.svg new file mode 100644 index 00000000..9bf21e76 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/figures/lifecycle-stable.svg @@ -0,0 +1,29 @@ + + lifecycle: stable + + + + + + + + + + + + + + + + lifecycle + + + + stable + + + diff --git a/chk.Rcheck/00_pkg_src/chk/man/figures/lifecycle-superseded.svg b/chk.Rcheck/00_pkg_src/chk/man/figures/lifecycle-superseded.svg new file mode 100644 index 00000000..db8d757f --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/figures/lifecycle-superseded.svg @@ -0,0 +1,21 @@ + + lifecycle: superseded + + + + + + + + + + + + + + + lifecycle + + superseded + + diff --git a/chk.Rcheck/00_pkg_src/chk/man/figures/logo.png b/chk.Rcheck/00_pkg_src/chk/man/figures/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..41e841052d00f5062dc8e47d607b3587cbdce640 GIT binary patch literal 2866 zcmV-23(fS2P)z1^@s6VLpz)0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU+)Ja4^RCwC#ozGJoMHI)o!$Js=2oYI< zWV1;nmX=mYJg5f`;K75XCH@DSDleW)Dt`cQ@sFJ(%uWB+-Y3A2w`+Z-(x81{7itOTN-{i5S>7IE? z!1jpUd9i&gHvBv(wy8@Wj;<15^Whf6Zd`2jJr{5<2*}d}*i5h^HrNr5rZec#0`v?4 zHpd-b7F)sRpHADLiv(C-xDz!x8^qwYuL#H!1XwSyV|K4~jgSv^v|Ib_okw1WEZX{f zjR40BcGw2%spjxV zjt}(j^;;@Pv2=}}V*Hve`Iy+fzu%C4w?s7fe`h!h2e|L#( zZf(ivGlH-w0vz42=c<>^!X4*CkL~My+Sl>Xljj$gWZX9N`J5@kDsBMSysfiiUTw2| zN7+z+pMZQI(77s=$Cf@Xl$K?h&)A@g1UR_PI_}uj;D%2g8`!6_K@Ix+m*~yqwRM^1 zQ?~0~CBX7<3wE#V@f!93te4IPHR$u)okf{pm9}Y5t{K=78|<)`&cYRE#n4BEmBf&0 zK}6gV`aElco*}^dbr!C;;MEqvQ*Iy|SZ9M8^cj##%PTU?ui2oBsRrDjjOVJexxuU$ z{v3?;fx%tFZNq&_xa}(}=CUM@5pIDsF5~Uf+2f+e_8xgkD{U*UZHPduB%Ah}j7y(+ z3}Ahw7YBvb>TJk{`AB;zFH3TTV5Q4=&{=>DYuKYgpXWty)-mnL6~Ud5)!CtJUu46c zs13S|B#Ep(t0+tIh`~yi@z7)arWbWJ^kleh9m;lw~}8lA%kI34+)R2^+*4QF^Xc%96YWtnXO@QQZ{a{(O60CMlqW zA$jw{sa&MPK%ZsFy|gFSv5W_}l0yfrAis1bANjD#?`({W_-Br3RK~*%m&FUhM(wY5@ktr*s+Wo+@P}rT5-*AL#7(8T}5RK9SxEoQI_n%bP;~~g%OM5n?clyLJ>mpU>jwQ84Yb)R1P)z^#S+{u`$Wa1!Cd9`5Y2Z*Scpz)6Ms>6f$Y?!65HOmGP>!6m>1 zH`Rb!$ugw{uCahy$ugx0u91LS$ugx4u5o}{$ugx8u5o~oMRLnBHG`a1xW)lS76~Al zStH14hHD&P000PC$Z3abWRT?ta@ye8G!)TS(4VXjQiC;+6Gxzj=*%&?H;rO+@smMk&tQA||_P zT)S>B7SV1TjCG()H65>AJHXDOYo-}iwbyZdY%MccroBU{x|DLime;0jqQhA+Uh)MN zv5j|Ct^}AUz)sI_R&tYEX;m56s8`%g1>ow#tghsSt-9j-Hmf|24>Y`rN$;XCDi>|q z!=)gLi~y4nU@`(sfXN6j8386Ez+?oNi~y4nV6t=o?myDOdb-*}Z%cqRvC$Wfva=_; zLvKrf$p|nR0VZqF5;6GU5Ev%D-%(yu}`DS6tiODQ~mYP4Cynx3?W&y@#uh zsr+D3qUc{>F@4%0xo`EZQEsE-MnY@TC{od zOs@s}*S|NL_T<;ahXQbM?3)V-TJhb47e&4-dLZCl|83QJ_zqC?vPLkj|5n}uS=$D% z8yR~1kZ|Wq>pQN!To-G`tYHtv%ZBkD+}vQlmS1v%>%_xf-Q2bG*2@5?UXvZz9pXb$ zZ|K?BaQy4Pu4)f<{_axK*V;C9(fEU(Z_iubOFll(uhpb5C+LxZ>(@HOhX=ja>Giq> zRd}uYUyDnuyteM?qG#M1-~d1V@`v@V_=;f>WDwgC_vpA}=ybbgUu*{hu(&mIiG!ef>PSbhMu zmah{(Tob!%7eD)ELhL_AklM^G%-vbEPJ|hNaq2T5KqsGn?y!LIAoSzkm|tV<8NN5P ziZjrH&H}1L@QZ-qir_iXFp9SSrRV4Luawh2$B^N1~+`pkIpIqT&K@hy@pjLtWXn%Ay*)|Qc%$bI}_&l zc~mzhKs#>RRiC>$JGCuKwyLvkWxP6_g)5$l;yQSgH)-qhxUJEyrej$$sLmn_C0Uf2 zwu7k1iq2fcO$*S&%p>jTxNTF`pK7MFKGKT-I~(qiCM{=(-ilr; znO?kLSMQVlP#G`LfNS&_y}97kR=2b#-0}Qk$&b!X zhBfRl25{Z5YFt*IRhK2}EvzzLY5>=OE-;PDk}A`Si3D8ZwzVot`Y7YUCYfXzFO`66 zK<8P^Y0s$3c&P?lr_ajEk}Ar01bDwbM_!iHCB2wBz;*f@dRa1#G9CeT*XOHV!zvh( zByMTXILmkhSWce^}hp0J#f?ll5Py QIRF3v07*qoM6N<$f==3#qyPW_ literal 0 HcmV?d00001 diff --git a/chk.Rcheck/00_pkg_src/chk/man/message_chk.Rd b/chk.Rcheck/00_pkg_src/chk/man/message_chk.Rd new file mode 100644 index 00000000..dbce651f --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/message_chk.Rd @@ -0,0 +1,48 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/err.R +\name{message_chk} +\alias{message_chk} +\title{Construct Tidyverse Style Message} +\usage{ +message_chk(..., n = NULL, tidy = TRUE) +} +\arguments{ +\item{...}{Multiple objects that are converted to a string using +\code{paste0(..., collapse = '')}.} + +\item{n}{The value of n for converting \code{sprintf}-like types.} + +\item{tidy}{A flag specifying whether capitalize the first character and add a missing period.} +} +\value{ +A string of the message. +} +\description{ +If \code{tidy = TRUE} constructs a tidyverse style message by +} +\details{ +\itemize{ +\item Capitalizing the first character if possible. +\item Adding a trailing . if missing. +} + +Also if \code{n != NULL} replaces the recognized \code{sprintf}-like types. +} +\section{\code{sprintf}-like types}{ + + +The following recognized \code{sprintf}-like types can be used in a message: + +\describe{ +\item{\code{n}}{The value of n.} +\item{\code{s}}{'' if n == 1 otherwise 's'} +\item{\code{r}}{'is' if n == 1 otherwise 'are'} +\item{\code{y}}{'y' if n == 1 otherwise 'ie'} +} +} + +\examples{ +message_chk("there \%r \%n", " problem director\%y\%s") +message_chk("there \%r \%n", " problem director\%y\%s", n = 1) +message_chk("There \%r \%n", " problem director\%y\%s.", n = 3) +} diff --git a/chk.Rcheck/00_pkg_src/chk/man/p.Rd b/chk.Rcheck/00_pkg_src/chk/man/p.Rd new file mode 100644 index 00000000..7cf943f4 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/p.Rd @@ -0,0 +1,38 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/p.R +\name{p} +\alias{p} +\alias{p0} +\title{Concatenate Strings} +\usage{ +p(..., sep = " ", collapse = NULL) + +p0(..., collapse = NULL) +} +\arguments{ +\item{...}{one or more \R objects, to be converted to character vectors.} + +\item{sep}{a character string to separate the terms. Not + \code{\link[base]{NA_character_}}.} + +\item{collapse}{an optional character string to separate the results. Not + \code{\link[base]{NA_character_}}. When \code{collapse} is a string, + the result is always a string (\code{\link[base]{character}} of length 1).} +} +\value{ +A character vector. +} +\description{ +A wrapper on \code{\link[base:paste]{base::paste()}}. +} +\section{Functions}{ +\itemize{ +\item \code{p0()}: A wrapper on \code{\link[base:paste]{base::paste0()}} + +}} +\examples{ +p("a", "b") +p(c("a", "b"), collapse = " ") +p0("a", "b") +p0(c("a", "b"), collapse = "") +} diff --git a/chk.Rcheck/00_pkg_src/chk/man/params.Rd b/chk.Rcheck/00_pkg_src/chk/man/params.Rd new file mode 100644 index 00000000..0db5dc2a --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/man/params.Rd @@ -0,0 +1,79 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/params.R +\name{params} +\alias{params} +\alias{parameters} +\alias{arguments} +\alias{args} +\title{Parameter Descriptions for chk Package} +\arguments{ +\item{...}{Additional arguments.} + +\item{x}{The object to check.} + +\item{x_name}{A string of the name of object x or NULL.} + +\item{y}{An object to check against.} + +\item{chk}{A flag specifying whether to check the other parameters.} + +\item{chk_fun}{A chk_ function.} + +\item{tolerance}{A non-negative numeric scalar.} + +\item{ext}{A character vector of the permitted file extensions +(without the .).} + +\item{exists}{A flag specifying whether the files/directories must (or must not) exist.} + +\item{value}{A non-missing scalar of a value.} + +\item{range}{A non-missing sorted vector of length 2 of the lower and +upper permitted values.} + +\item{inclusive}{A flag specifying whether the range is exclusive.} + +\item{regexp}{A string of a regular expression.} + +\item{values}{A vector of the permitted values.} + +\item{class}{A character vector specifying the possible class values.} + +\item{length}{A count of the length.} + +\item{upper}{A count of the max length.} + +\item{formals}{A count of the number of formal arguments.} + +\item{incomparables}{A vector of values that cannot be compared. +FALSE means that all values can be compared.} + +\item{by}{A character vector specifying the column names to join x and y on. +If named the names are the corresponding columns in x.} + +\item{exclusive}{A flag specifying whether x must only include columns named in values.} + +\item{order}{A flag specifying whether the order of columns in x must match names in values.} + +\item{nrow}{A flag or a whole numeric vector of the value, value range or possible values.} + +\item{key}{A character vector of the columns that represent a unique key.} + +\item{vld_fun}{A vld_ function.} +} +\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{ +Default parameter descriptions which may be overridden in individual +functions. +} +\details{ +A flag is a non-missing logical scalar. + +A string is a non-missing character scalar. +} +\keyword{internal} diff --git a/chk.Rcheck/00_pkg_src/chk/tests/testthat.R b/chk.Rcheck/00_pkg_src/chk/tests/testthat.R new file mode 100644 index 00000000..af1b1aa0 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/tests/testthat.R @@ -0,0 +1,12 @@ +# This file is part of the standard setup for testthat. +# It is recommended that you do not modify it. +# +# Where should you do additional test configuration? +# Learn more about the roles of various files in: +# * https://r-pkgs.org/testing-design.html#sec-tests-files-overview +# * https://testthat.r-lib.org/articles/special-files.html + +library(testthat) +library(chk) + +test_check("chk") diff --git a/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-aaa-deprecated.R b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-aaa-deprecated.R new file mode 100644 index 00000000..0257e53a --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-aaa-deprecated.R @@ -0,0 +1,34 @@ +test_that("vld_no_missing", { + rlang::local_options(lifecycle_verbosity = "quiet") + + expect_true(vld_no_missing(1)) + expect_true(vld_no_missing(integer(0))) + expect_false(vld_no_missing(NA)) + expect_false(vld_no_missing(c(NA, 1))) +}) + +test_that("chk_no_missing", { + rlang::local_options(lifecycle_verbosity = "quiet") + + expect_null(chk_no_missing(1)) + expect_invisible(chk_no_missing(1)) + expect_chk_error(chk_no_missing(NA), "^`NA` must not have missing values[.]$") + expect_chk_error(chk_no_missing(NA, x_name = "1"), "^1 must not have missing values[.]$") +}) + + +test_that("warning messages are generated for dep functions", { + rlang::local_options(lifecycle_verbosity = "warning") + + expect_warning(chk_dirs(tempdir())) + expect_warning(chk_has(1:3, 1)) + expect_warning(chk_in(1, 1:3)) + expect_warning(expect_warning(chk_no_missing(1))) + expect_warning(vld_no_missing(1)) + expect_warning(chk_proportion(1)) + expect_warning(deparse_backtick(2)) + + file <- tempfile() + writeLines(file, text = "some test data") + expect_warning(chk_files(file)) +}) diff --git a/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-cc.R b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-cc.R new file mode 100644 index 00000000..7364c4ac --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-cc.R @@ -0,0 +1,89 @@ +test_that("cc with atomic vectors", { + expect_identical(cc(logical(0)), character(0)) + expect_match(cc(1), "^1$") + expect_match(cc(1, brac = "'"), "^'1'$") + expect_match(cc(c(1, 1), " or "), "^1 or 1$") + expect_match(cc(1:2, " or "), "^1 or 2$") + expect_match(cc(1:2), "^1, 2$") + expect_match(cc(1:3, " or "), "^1, 2 or 3$") + expect_match(cc(1:10, " or "), "^1, 2, 3, 4, 5, 6, 7, 8, 9 or 10$") + expect_match(cc(1:11, " or "), "^1, 2, 3, 4, 5, 6, 7, 8, ... or 11$") + expect_match(cc(11:1, " or "), "^11, 10, 9, 8, 7, 6, 5, 4, ... or 1$") + expect_match( + cc(11:1, brac = "'"), + "^'11', '10', '9', '8', '7', '6', '5', '4', ..., '1'$" + ) +}) + +test_that("cc errors", { + expect_chk_error( + cc(1, conj = 1), + "^`conj` must be a string [(]non-missing character scalar[)][.]$" + ) + expect_chk_error( + cc(1, conj = character(0)), + "^`conj` must be a string [(]non-missing character scalar[)][.]$" + ) + expect_chk_error( + cc(1, conj = as.character(1:2)), + "^`conj` must be a string [(]non-missing character scalar[)][.]$" + ) + expect_chk_error( + cc(1, brac = 1), + "^`brac` must inherit from S3 class 'character'[.]$" + ) + expect_chk_error( + cc(1, brac = character(0)), + "^`length[(]brac[)]` must be between 1 and 2, not 0[.]$" + ) + expect_chk_error( + cc(1, brac = as.character(1:3)), + "^`length[(]brac[)]` must be between 1 and 2, not 3[.]$" + ) + expect_chk_error( + cc(1, sep = as.character(1:3)), + "^`sep` must be a string [(]non-missing character scalar[)][.]$" + ) +}) + +test_that("cc with character", { + expect_identical(cc(character(0)), character(0)) + expect_match(cc(as.character("")), "^''$") + expect_match(cc(as.character("a")), "^'a'$") +}) + +test_that("cc with factor", { + expect_identical(cc(factor(1)[-1]), character(0)) + expect_match(cc(as.factor("")), "^''$") + expect_match(cc(as.factor("a")), "^'a'$") +}) + +test_that("cc with double brackets", { + expect_match(cc(1:2, brac = c("{", "}")), "^\\{1\\}, \\{2\\}$") + expect_match(cc(1:2, brac = c("", "}{")), "^1\\}\\{, 2\\}\\{$") +}) + +test_that("cc with random objects", { + expect_identical(cc(list()), character(0)) + expect_match(cc(list(1)), "^1$") + expect_match(cc(list(x = 1)), "^1$") + expect_match(cc(matrix(1)), "^1$") + expect_match(cc(matrix(1:9, 3), " or "), "^1, 2, 3, 4, 5, 6, 7, 8 or 9$") +}) + +test_that("cc with sep", { + expect_identical(cc(1:3, sep = "|"), "1|2, 3") +}) + +test_that("cc with ellipsis", { + expect_identical(cc(1:10), c("1, 2, 3, 4, 5, 6, 7, 8, 9, 10")) + expect_identical(cc(1:10, ellipsis = 3), c("1, ..., 10")) + expect_chk_error( + cc(1:10, ellipsis = 2), + "`ellipsis` must be greater than or equal to 3, not 2[.]" + ) + expect_chk_error( + cc(1:10, ellipsis = 2.5), + "`ellipsis` must be a whole number [(]non-missing integer scalar or double equivalent[)][.]" + ) +}) diff --git a/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-check-data.R b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-check-data.R new file mode 100644 index 00000000..44616e41 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-check-data.R @@ -0,0 +1,35 @@ +test_that("check_data works", { + expect_identical(check_data(data.frame()), data.frame()) + expect_invisible(check_data(data.frame())) + expect_identical(check_data(data.frame(x = 1)), data.frame(x = 1)) + expect_identical( + check_data(data.frame(x = 1, values = list(x = 1))), + check_data(data.frame(x = 1, values = list(x = 1))) + ) + expect_identical(check_data(data.frame(x = 1), nrow = c(1, Inf)), data.frame(x = 1)) +}) + +test_that("check_data fails", { + expect_chk_error( + check_data(data.frame(), nrow = TRUE), + "`nrow[(]data.frame[(][)][)]` must be greater than 0, not 0." + ) + expect_chk_error( + check_data(data.frame(), values = list(x = 1)), + "`names[(]data.frame[(][)][)]` must include 'x'." + ) + + expect_chk_error(check_data(data.frame(x = 1, y = 2), values = list(x = 1), exclusive = TRUE), "^`names[(]data.frame[(]x = 1, y = 2[)][)]` must not include 'y'[.]$") + expect_chk_error( + check_data(data.frame(x = 1), values = list(x = 1L)), + "`data.frame[(]x = 1[)][$]x` must inherit from S3 class 'integer'." + ) + expect_chk_error( + check_data(data.frame(x = c(1, 1)), key = "x"), + "^Column 'x' in `data.frame[(]x = c[(]1, 1[)][)]` must be a unique key[.]$" + ) + expect_chk_error( + check_data(data.frame(x = ordered(1:2)), values = list(x = ordered(1:2, levels = 2:1))), + "^`levels[(]data.frame[(]x = ordered[(]1:2[)][)][$]x[)]` must have [(]the first occurence of[)] each of the following elements in the following order: '2', '1'[.]$" + ) +}) diff --git a/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-check-dim.R b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-check-dim.R new file mode 100644 index 00000000..537424e3 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-check-dim.R @@ -0,0 +1,67 @@ +test_that("check_dim length", { + expect_identical(check_dim(1), 1) + expect_invisible(check_dim(1)) + expect_chk_error( + check_dim(1:2, dim = identity), + "`dim[(]x[)]` must be a whole number [(]non-missing integer scalar or double equivalent[)][.]" + ) + expect_identical(check_dim(integer(0)), integer(0)) + expect_chk_error( + check_dim(integer(0), values = TRUE), + "^`length[(]integer[(]0[)][)]` must be greater than 0, not 0[.]$" + ) + expect_chk_error( + check_dim(1, values = FALSE), + "^`length[(]1[)]` must be equal to 0L[.]" + ) + expect_identical(check_dim(2, values = 1), check_dim(2, values = 1)) + expect_chk_error( + check_dim(1, values = 2), + "^`length[(]1[)]` must be equal to 2[.]" + ) + expect_chk_error( + check_dim(1, values = 2:3), + "^`length[(]1[)]` must be between 2 and 3, not 1[.]" + ) + expect_chk_error( + check_dim(1, values = 3:2), + "^`length[(]1[)]` must be between 2 and 3, not 1[.]" + ) + expect_identical(check_dim(1:2, values = 2:3), check_dim(1:2, values = 2:3)) + expect_chk_error( + check_dim(2, values = c(2, 2)), + "`length[(]2[)]` must be equal to 2[.]" + ) + expect_chk_error( + check_dim(2, values = c(2, 2, 2)), + "`length[(]2[)]` must match 2, not 1[.]" + ) + expect_chk_error( + check_dim(2, values = c(3, 2, 2)), + "`length[(]2[)]` must match 2 or 3, not 1[.]" + ) + + expect_chk_error( + check_dim(1, values = 1.1), "^At least one of the following conditions must be met:\n[*] `values` must be a flag [(]TRUE or FALSE[)].\n[*] `values` must be a whole numeric vector \\(integer vector or double equivalent\\)\\.$" + ) +}) + +test_that("check_dim nrow", { + expect_identical( + check_dim(data.frame(x = 1), dim = nrow), + check_dim(data.frame(x = 1), dim = nrow) + ) + expect_invisible(check_dim(data.frame(x = 1), dim = nrow)) + expect_chk_error( + check_dim(data.frame(x = integer(0)), values = TRUE, dim = nrow), + "`nrow[(]data.frame[(]x = integer[(]0[)][)][)]` must be greater than 0, not 0[.]" + ) + expect_chk_error( + check_dim(data.frame(x = integer(0)), dim = nrow, dim_name = "ncol", values = TRUE), + "`ncol[(]data.frame[(]x = integer[(]0[)][)][)]` must be greater than 0, not 0[.]" + ) + expect_chk_error( + check_dim(data.frame(x = integer(0)), dim = nrow, x_name = "y", dim_name = "ncol", values = TRUE), + "`ncol[(]y[)]` must be greater than 0, not 0[.]" + ) +}) diff --git a/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-check-dirs.R b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-check-dirs.R new file mode 100644 index 00000000..df841c4c --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-check-dirs.R @@ -0,0 +1,44 @@ +test_that("check_dirs works", { + expect_identical(check_dirs(character(0)), character(0)) + expect_invisible(check_dirs(character(0))) + expect_identical( + check_dirs(character(0), exists = TRUE), + check_dirs(character(0), exists = TRUE) + ) + expect_invisible(check_dirs(character(0), exists = TRUE)) + + tmp <- withr::local_tempfile() + expect_identical(check_dirs(tmp, exists = FALSE), check_dirs(tmp, exists = FALSE)) + expect_invisible(check_dirs(tmp, exists = FALSE)) + tmp <- withr::local_tempdir() + expect_identical(check_dirs(tmp, exists = TRUE), check_dirs(tmp, exists = TRUE)) + expect_invisible(check_dirs(tmp, exists = TRUE)) +}) + +test_that("check_dirs errors", { + expect_chk_error(check_dirs(NA_character_)) + + tmp <- withr::local_tempfile() + writeLines(tmp, text = "some test data") + + expect_chk_error( + check_dirs(tmp), + "^`tmp` must specify directories [(]'.*' is a file[)][.]$" + ) + expect_chk_error( + check_dirs(tmp, exists = FALSE), + "^`tmp` must specify directories [(]'.*' is a file[)][.]$" + ) + + tmp <- withr::local_tempfile() + expect_chk_error( + check_dirs(tmp), + "^`tmp` must specify existing directories [(]'.*' can't be found[)][.]$" + ) + + tmp <- withr::local_tempdir() + expect_chk_error( + check_dirs(tmp, exists = FALSE), + "^`tmp` must not specify existing directories [(]'.*' exists[)][.]$" + ) +}) diff --git a/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-check-files.R b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-check-files.R new file mode 100644 index 00000000..4f16d4a8 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-check-files.R @@ -0,0 +1,39 @@ +test_that("check_files works", { + expect_identical(check_files(character(0)), character(0)) + expect_invisible(check_files(character(0))) + expect_identical( + check_files(character(0), exists = TRUE), + check_files(character(0), exists = TRUE) + ) + expect_invisible(check_files(character(0), exists = TRUE)) + + tmp <- withr::local_tempfile() + expect_identical(check_files(tmp, exists = FALSE), check_files(tmp, exists = FALSE)) + expect_invisible(check_files(tmp, exists = FALSE)) + writeLines(tmp, text = "some test data") + expect_identical(check_files(tmp, exists = TRUE), check_files(tmp, exists = TRUE)) + expect_invisible(check_files(tmp, exists = TRUE)) +}) + +test_that("check_files errors", { + expect_chk_error(check_files(NA_character_)) + + tmp <- withr::local_tempfile() + expect_chk_error( + check_files(tmp), + "^`tmp` must specify existing files [(]'.*' can't be found[)][.]$" + ) + expect_chk_error( + check_files(tempdir()), + "^`tempdir[(][)]` must specify files [(]'.*' is a directory[)][.]$" + ) + expect_chk_error( + check_files(tempdir(), exists = FALSE), + "^`tempdir[(][)]` must specify files [(]'.*' is a directory[)][.]$" + ) + writeLines(tmp, text = "some test data") + expect_chk_error( + check_files(tmp, exists = FALSE), + "^`tmp` must not specify existing files [(]'.*' exists[)][.]$" + ) +}) diff --git a/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-check-key.R b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-check-key.R new file mode 100644 index 00000000..3c856bf1 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-check-key.R @@ -0,0 +1,25 @@ +test_that("check_key works", { + expect_identical(check_key(data.frame()), data.frame()) + expect_invisible(check_key(data.frame())) + expect_invisible(check_key(data.frame(x = 1))) + expect_invisible(check_key(data.frame(x = 1), "x")) + expect_invisible(check_key(data.frame(x = c(1, 1), y = 1:2), c("y", "x"))) + expect_invisible(check_key(data.frame(x = c(1, 1), y = c(NA, 1)), c("y", "x"))) + expect_invisible(check_key(data.frame(x = c(1, 1), y = NA), c("y", "x"), na_distinct = TRUE)) +}) + +test_that("check_key fails", { + x <- data.frame(x = c(1, 2), y = c(1, 1), z = NA) + expect_chk_error( + check_key(x, c("y", "y")), + "`key` must be unique[.]$" + ) + expect_chk_error( + check_key(x, "y"), + "^Column 'y' in `x` must be a unique key[.]$" + ) + expect_chk_error( + check_key(x, c("y", "z")), + "^Columns 'y' and 'z' in `x` must be a unique key[.]$" + ) +}) diff --git a/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-check-length.R b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-check-length.R new file mode 100644 index 00000000..c4d89132 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-check-length.R @@ -0,0 +1,44 @@ +test_that("check_length length", { + expect_identical(check_length(1), 1) + expect_invisible(check_length(1)) + + expect_identical(check_length(integer(0)), integer(0)) + expect_chk_error( + check_length(integer(0), values = TRUE), + "^`length[(]integer[(]0[)][)]` must be greater than 0, not 0[.]$" + ) + expect_chk_error( + check_length(1, values = FALSE), + "^`length[(]1[)]` must be equal to 0L[.]" + ) + expect_identical(check_length(2, values = 1), check_length(2, values = 1)) + expect_chk_error( + check_length(1, values = 2), + "^`length[(]1[)]` must be equal to 2[.]" + ) + expect_chk_error( + check_length(1, values = 2:3), + "^`length[(]1[)]` must be between 2 and 3, not 1[.]" + ) + expect_chk_error( + check_length(1, values = 3:2), + "^`length[(]1[)]` must be between 2 and 3, not 1[.]" + ) + expect_identical(check_length(1:2, values = 2:3), check_length(1:2, values = 2:3)) + expect_chk_error( + check_length(2, values = c(2, 2)), + "`length[(]2[)]` must be equal to 2[.]" + ) + expect_chk_error( + check_length(2, values = c(2, 2, 2)), + "`length[(]2[)]` must match 2, not 1[.]" + ) + expect_chk_error( + check_length(2, values = c(3, 2, 2)), + "`length[(]2[)]` must match 2 or 3, not 1[.]" + ) + + expect_chk_error( + check_length(1, values = 1.1), "^At least one of the following conditions must be met:\n[*] `values` must be a flag [(]TRUE or FALSE[)].\n[*] `values` must be a whole numeric vector \\(integer vector or double equivalent\\)\\.$" + ) +}) diff --git a/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-check-names.R b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-check-names.R new file mode 100644 index 00000000..d29c0b27 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-check-names.R @@ -0,0 +1,47 @@ +test_that("check_names", { + expect_identical(check_names(c(x = 1)), c(x = 1)) + expect_invisible(check_names(c(x = 1))) + expect_identical(check_names(c(x = 1), "x"), check_names(c(x = 1), "x")) + expect_identical( + check_names(c(x = 1, y = 2), "x"), + check_names(c(x = 1, y = 2), "x") + ) + expect_identical( + check_names(c(x = 1, y = 2), c("y", "x")), + check_names(c(x = 1, y = 2), c("y", "x")) + ) +}) + +test_that("check_names fails", { + expect_chk_error( + check_names(character(0)), + "^`character[(]0[)]` must be named[.]$" + ) + x <- structure(list(), .Names = character(0)) + x <- structure(list(), .Names = character(0)) + expect_chk_error( + check_names(c(x = 1), exclusive = TRUE), + "^`c[(]x = 1[)]` must not have any elements[.]$" + ) + expect_chk_error( + check_names(x, "x"), + "^`names[(]x[)]` must include 'x'[.]$" + ) + expect_chk_error( + check_names(c(x = 1), c("x", "y")), + "`names[(]c[(]x = 1[)][)]` must include 'y'[.]$" + ) + expect_chk_error( + check_names(c(x = 1, z = 2), "x", exclusive = TRUE), + "^`names[(]c[(]x = 1, z = 2[)][)]` must not include 'z'[.]$" + ) + + expect_chk_error( + check_names(c(x = 1, y = 2), c("y", "x"), order = TRUE), + "`names[(]c[(]x = 1, y = 2[)][)]` must include 'y' and 'x' in that order[.]$" + ) + expect_chk_error( + check_names(c(x = 1, y = 2), c("y", "x"), order = TRUE, x_name = "b"), + "`names[(]b[)]` must include 'y' and 'x' in that order[.]$" + ) +}) diff --git a/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-check-values.R b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-check-values.R new file mode 100644 index 00000000..801d3ab2 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-check-values.R @@ -0,0 +1,108 @@ +test_that("check_values pass", { + expect_identical(check_values(1, 1), check_values(1, 1)) + expect_invisible(check_values(1, 1)) + expect_identical(check_values(1, numeric(0)), check_values(1, numeric(0))) + expect_identical(check_values(integer(0), 1:3), check_values(integer(0), 1:3)) + expect_identical(check_values(1L, integer(0)), check_values(1L, integer(0))) + expect_identical(check_values(NA_real_, numeric(0)), check_values(NA_real_, numeric(0))) + expect_identical(check_values(1, -1), check_values(1, -1)) + expect_identical(check_values(1, NA_real_), check_values(1, NA_real_)) + expect_identical(check_values(1, c(2, NA_real_)), check_values(1, c(2, NA_real_))) + expect_identical(check_values(1, c(1, 2, NA_real_)), check_values(1, c(1, 2, NA_real_))) + expect_identical(check_values(1, c(1, 1)), check_values(1, c(1, 1))) + expect_identical(check_values(1, c(0.5, 2, NA_real_)), check_values(1, c(0.5, 2, NA_real_))) + expect_identical( + check_values(c(1, NA_real_), c(0.5, 2, NA_real_)), + check_values(c(1, NA_real_), c(0.5, 2, NA_real_)) + ) + expect_identical(check_values(factor(1), factor(2)), check_values(factor(1), factor(2))) + expect_identical( + check_values(factor(c(1, NA)), factor(c(2, NA))), + check_values(factor(c(1, NA)), factor(c(2, NA))) + ) + expect_identical(check_values(factor(1:3), factor(1:2)), check_values(factor(1:3), factor(1:2))) + expect_identical( + check_values(factor(1:3), factor(1:2, levels = 1:2)), + check_values(factor(1:3), factor(1:2, levels = 1:2)) + ) + expect_identical( + check_values(ordered(1:2), factor(c(1:2, NA))), + check_values(ordered(1:2), factor(c(1:2, NA))) + ) + expect_identical( + check_values(ordered(1:3), factor(c(1:2))), + check_values(ordered(1:3), factor(c(1:2))) + ) + expect_identical( + check_values(as.character(1:2), as.character(2:1)), + check_values(as.character(1:2), as.character(2:1)) + ) + expect_identical(check_values(factor(1:3), factor(1:3)), check_values(factor(1:3), factor(1:3))) +}) + +test_that("check_values fail", { + expect_chk_error( + check_values(1.1, c(1, 1)), + "^All elements of `1.1` must be equal to 1[.]" + ) + expect_chk_error( + check_values(1L, 1), + "^`1L` must inherit from S3 class 'numeric'[.]$" + ) + expect_chk_error(check_values(1, 1L), "`1` must inherit from S3 class 'integer'[.]") + expect_chk_error(check_values(1L, numeric(0)), "`1L` must inherit from S3 class 'numeric'[.]") + expect_chk_error( + check_values(NA_real_, 1), + "`NA_real_` must not have any missing values[.]" + ) + expect_chk_error( + check_values(1L, 2:3), + "`1L` must be between 2 and 3, not 1[.]" + ) + expect_chk_error( + check_values(1:10, 21:22), + "`1:10` must have values between 21 and 22[.]" + ) + expect_chk_error( + check_values(1:10, 22:21), + "`1:10` must have values between 21 and 22[.]" + ) + expect_chk_error( + check_values(1:10, 21:23), + "`1:10` must have values matching 21, 22 or 23[.]" + ) + expect_chk_error( + check_values(factor(1:2), as.character(1:3)), + "^`factor[(]1:2[)]` must inherit from S3 class 'character'[.]$" + ) + + expect_chk_error( + check_values(factor(1:2), ordered(1:3)), + "^`factor[(]1:2[)]` must inherit from S3 class 'ordered'[.]$" + ) + + expect_chk_error( + check_values(factor(1:2), factor(2:3)), + "^`levels[(]factor[(]1:2[)][)]` must include '3'[.]$" + ) + + expect_chk_error( + check_values(factor(1:2), factor(1:3)), + "^`levels[(]factor[(]1:2[)][)]` must be identical to the y object of class [.]" + ) + + expect_chk_error( + check_values(ordered(c(1, 3), levels = 1:3), ordered(c(1, 2), levels = 1:3)), + "^`ordered[(]c[(]1, 3[)], levels = 1:3[)]` must have values between '1' and '2'[.]$" + ) + + expect_chk_error( + check_values(factor(1:2), factor(1:2, levels = 2:1)), + "^`levels[(]factor[(]1:2[)][)]` must have [(]the first occurence of[)] each of the following elements in the following order: '2', '1'[.]$" + ) + + expect_chk_error( + check_values(ordered(1:2), ordered(1:2, levels = 2:1)), + "^`levels[(]ordered[(]1:2[)][)]` must have [(]the first occurence of[)] each of the following elements in the following order: '2', '1'[.]$" + ) +}) diff --git a/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-all.R b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-all.R new file mode 100644 index 00000000..7a94699a --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-all.R @@ -0,0 +1,93 @@ +test_that("vld_all", { + expect_true(vld_all(character(0), vld_true)) + expect_true(vld_all(NULL, vld_null)) + expect_false(vld_all(NULL, vld_not_null)) + expect_false(vld_all(FALSE, vld_true)) + expect_true(vld_all(FALSE, vld_false)) +}) + +test_that("chk_all", { + expect_identical(chk_all(character(0), chk_true), character(0), chk_true) + expect_invisible(chk_all(character(0), chk_true)) + expect_identical(chk_all(NULL, chk_null), NULL, chk_null) + expect_invisible(chk_all(NULL, chk_null)) + expect_identical(chk_all(TRUE, chk_true), TRUE, chk_true) + expect_identical(chk_all(FALSE, chk_false), FALSE, chk_false) + expect_identical(chk_all(c(TRUE, TRUE), chk_true), c(TRUE, TRUE), chk_true) + expect_identical(chk_all(1.1, chk_gt, 1), 1.1, chk_gt, 1) + + expect_chk_error( + chk_all(NULL, chk_flag), + "^`NULL` must be a flag [(]TRUE or FALSE[)][.]$" + ) + expect_chk_error( + chk_all(NULL, chk_flag, x_name = "NULL"), + "^NULL must be a flag [(]TRUE or FALSE[)][.]$" + ) + expect_chk_error( + chk_all(FALSE, chk_true), + "^All elements of `FALSE` must be TRUE[.]$" + ) + expect_chk_error( + chk_all(FALSE, chk_true, x_name = TRUE), + "^All elements of TRUE must be TRUE[.]$" + ) + expect_chk_error( + chk_all(1.1, chk_gt, 2), + "^All elements of `1.1` must be greater than 2, not 1.1[.]$" + ) +}) + +test_that("vld_all_identical", { + expect_true(vld_all_identical(NULL)) + expect_true(vld_all_identical(character(0))) + expect_true(vld_all_identical(1)) + expect_true(vld_all_identical(c(TRUE, TRUE))) + expect_true(vld_all_identical(c(NA, NA))) + expect_false(vld_all_identical(c(1, 2))) +}) + +test_that("chk_all_identical", { + expect_identical(chk_all_identical(NULL), NULL) + expect_invisible(chk_all_identical(NULL)) + expect_chk_error(chk_all_identical(c(1, 2)), "^`c[(]1, 2[)]` must have identical elements[.]$") +}) + + +test_that("vld_all_equal", { + expect_true(vld_all_equal(NULL)) + expect_true(vld_all_equal(character(0))) + expect_true(vld_all_equal(1)) + expect_true(vld_all_equal(c(TRUE, TRUE))) + expect_true(vld_all_equal(c(NA, NA))) + expect_false(vld_all_equal(c(1, 2))) + expect_false(vld_all_equal(c(1, 1.0000001), tolerance = 1.490116e-08)) + expect_true(vld_all_equal(c(1, 1.00000001), tolerance = 1.490116e-08)) + expect_true(vld_all_equal(list(c(x = 1), c(x = 1)))) + expect_false(vld_all_equal(list(c(x = 1), c(y = 1)))) +}) + +test_that("chk_all_equal", { + expect_identical(chk_all_equal(NULL), NULL) + expect_invisible(chk_all_equal(NULL), NULL) + expect_chk_error(chk_all_equal(c(1, 2)), "^`c[(]1, 2[)]` must have equal elements[.]$") +}) + +test_that("vld_all_equivalent", { + expect_true(vld_all_equivalent(NULL)) + expect_true(vld_all_equivalent(character(0))) + expect_true(vld_all_equivalent(1)) + expect_true(vld_all_equivalent(c(TRUE, TRUE))) + expect_true(vld_all_equivalent(c(NA, NA))) + expect_false(vld_all_equivalent(c(1, 2))) + expect_false(vld_all_equivalent(c(1, 1.0000001), tolerance = 1.490116e-08)) + expect_true(vld_all_equivalent(c(1, 1.00000001), tolerance = 1.490116e-08)) + expect_true(vld_all_equivalent(list(c(x = 1), c(x = 1)))) + expect_true(vld_all_equivalent(list(c(x = 1), c(y = 1)))) +}) + +test_that("chk_all_equivalent", { + expect_identical(chk_all_equivalent(NULL), NULL) + expect_invisible(chk_all_equivalent(NULL)) + expect_chk_error(chk_all_equivalent(c(1, 2)), "^`c[(]1, 2[)]` must have equivalent elements[.]$") +}) diff --git a/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-array.R b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-array.R new file mode 100644 index 00000000..303cec8e --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-array.R @@ -0,0 +1,15 @@ +test_that("vld_array", { + expect_false(vld_array(1)) + expect_true(vld_array(array())) + expect_true(vld_array(array(NA))) + expect_true(vld_array(array(1))) +}) + +test_that("chk_array", { + expect_identical(chk_array(array(1)), array(1)) + expect_invisible(chk_array(array(1))) + expect_chk_error( + chk_array(1), + "^`1` must be an array[.]$" + ) +}) diff --git a/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-atomic.R b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-atomic.R new file mode 100644 index 00000000..ae88d361 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-atomic.R @@ -0,0 +1,20 @@ +test_that("vld_atomic", { + expect_true(vld_atomic(1)) + expect_true(vld_atomic(matrix(1:3))) + expect_true(vld_atomic(character(0))) + expect_false(vld_atomic(list(1))) + + skip_on_cran() + if (sub("(R version )((\\d+\\.){2,2}\\d+)(.*)", "\\2", R.version$version.string) <= "4.4.0") { + expect_true(vld_atomic(NULL)) + } else { + expect_false(vld_atomic(NULL)) + } +}) + +test_that("chk_atomic", { + expect_identical(chk_atomic(1), 1) + expect_invisible(chk_atomic(1)) + expect_chk_error(chk_atomic(list(1)), "^`list[(]1[)]` must be atomic[.]$") + expect_chk_error(chk_atomic(list(1), x_name = 1), "^1 must be atomic[.]$") +}) diff --git a/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-character-or-factor.R b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-character-or-factor.R new file mode 100644 index 00000000..f90b88bb --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-character-or-factor.R @@ -0,0 +1,18 @@ +test_that("vld_character_or_factor", { + expect_true(vld_character_or_factor("1")) + expect_true(vld_character_or_factor(matrix("a"))) + expect_true(vld_character_or_factor(character(0))) + expect_true(vld_character_or_factor(NA_character_)) + expect_false(vld_character_or_factor(1)) + expect_false(vld_character_or_factor(TRUE)) + expect_true(vld_character_or_factor(factor("text"))) +}) + +test_that("chk_character_or_factor", { + expect_identical(chk_character_or_factor("1"), "1") + expect_invisible(chk_character_or_factor("1")) + expect_chk_error( + chk_character_or_factor(TRUE), + "^`TRUE` must be character or factor[.]$" + ) +}) diff --git a/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-character.R b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-character.R new file mode 100644 index 00000000..006862ef --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-character.R @@ -0,0 +1,18 @@ +test_that("vld_character", { + expect_true(vld_character("1")) + expect_true(vld_character(matrix("a"))) + expect_true(vld_character(character(0))) + expect_true(vld_character(NA_character_)) + expect_false(vld_character(1)) + expect_false(vld_character(TRUE)) + expect_false(vld_character(factor("text"))) +}) + +test_that("chk_character", { + expect_identical(chk_character("1"), "1") + expect_invisible(chk_character("1")) + expect_chk_error( + chk_character(TRUE), + "^`TRUE` must be character[.]$" + ) +}) diff --git a/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-chr.R b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-chr.R new file mode 100644 index 00000000..9f1a059f --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-chr.R @@ -0,0 +1,22 @@ +test_that("vld_chr", { + rlang::local_options(lifecycle_verbosity = "quiet") + + lifecycle::expect_deprecated(chk_chr("")) + + expect_false(vld_chr(character(0))) + expect_true(vld_chr(NA_character_)) + expect_true(vld_chr("")) + expect_true(vld_chr("a")) + expect_false(vld_chr(c("a", "b"))) +}) + +test_that("chk_chr", { + rlang::local_options(lifecycle_verbosity = "quiet") + + lifecycle::expect_deprecated(chk_chr("")) + + expect_identical(chk_chr(""), "") + expect_invisible(chk_chr("")) + expect_chk_error(chk_chr(1), "^`1` must be a character scalar[.]$") + expect_chk_error(chk_chr(1, x_name = "''"), "^'' must be a character scalar[.]$") +}) diff --git a/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-compatible-lengths.R b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-compatible-lengths.R new file mode 100644 index 00000000..720b220e --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-compatible-lengths.R @@ -0,0 +1,145 @@ +# vld ----- +test_that("validate true single vector passed", { + x <- c(1, 3, 5) + expect_true(vld_compatible_lengths(x)) +}) + +test_that("validate true when vectors are all the same length", { + x <- c(1, 3, 5) + y <- c(2, 4, 6) + expect_true(vld_compatible_lengths(x, y)) +}) + +test_that("validate true when one vectors is length 1 and other vectors are the + same length", { + x <- c(1, 3, 5) + y <- c(2, 4, 6) + z <- c(1) + expect_true(vld_compatible_lengths(x, y, z)) +}) + +test_that("validate true when vector is length 0", { + x <- NULL + expect_true(vld_compatible_lengths(x)) +}) + +test_that("validate true when nothing", { + expect_true(vld_compatible_lengths()) +}) + +test_that("validate false if one vectors is length 0", { + x <- c(1, 3, 5) + y <- c(2, 4, 6) + z <- NULL + expect_false(vld_compatible_lengths(x, y, z)) +}) + +test_that("validate false when two vectors have multiple lengths", { + x <- c(1, 3, 5) + y <- c(2, 4) + expect_false(vld_compatible_lengths(x, y)) +}) + +test_that("validate false when vectors are multiple lengths", { + v <- c(1, 3, 5) + x <- c(2, 4) + y <- c(1, 2, 3, 4) + z <- c(8) + expect_false(vld_compatible_lengths(v, x, y, z)) +}) + +test_that("validate false if data frame of two lengths passed", { + x <- data.frame(a = c(1, 2, 3), b = c(4, 5, 6)) + y <- data.frame(a = c(1, 2), b = c(6, 7), c = c(8, 9)) + expect_false(vld_compatible_lengths(x, y)) +}) + +test_that("validate true when data frames passed", { + x <- data.frame(a = c(1, 2, 3), b = c(4, 5, 6)) + y <- data.frame(a = c(1, 2, 3)) + expect_true(vld_compatible_lengths(x, y)) +}) + +test_that("validate true if list passed", { + x <- list(a = c(1, 2, 3), b = c(4, 5, 6)) + expect_true(vld_compatible_lengths(x)) +}) + +test_that("validate true if lists passed", { + x <- list(a = c(1, 2, 3), b = c(4, 5, 6)) + y <- list(e = c(1, 2, 3), f = c(4, 5, 6)) + expect_true(vld_compatible_lengths(x, y)) +}) + +# chk ----- +test_that("passes when single value passed", { + x <- 1 + expect_null(chk_compatible_lengths(x)) + expect_invisible(chk_compatible_lengths(x)) +}) + +test_that("passes when single vector passed", { + x <- c(1, 3, 5) + expect_null(chk_compatible_lengths(x)) + expect_invisible(chk_compatible_lengths(x)) +}) + +test_that("passes when multiple vectors of same length passed", { + x <- c(1, 3, 5) + y <- c(2, 4, 6) + z <- c(7, 8, 0) + expect_null(chk_compatible_lengths(x, y, z)) + expect_invisible(chk_compatible_lengths(x, y, z)) +}) + +test_that("passes when multiple vectors of same length passed and vectors of + length one passed", { + x <- c(1, 3, 5) + y <- c(2, 4, 6) + z <- 7 + expect_null(chk_compatible_lengths(x, y, z)) + expect_invisible(chk_compatible_lengths(x, y, z)) +}) + +test_that("passes when only vector of length zero passed", { + x <- NULL + expect_null(chk_compatible_lengths(x)) + expect_invisible(chk_compatible_lengths(x)) +}) + +test_that("throws error when vector of length zero and other length passed", { + x <- NULL + y <- c(1, 2, 3) + expect_error( + chk_compatible_lengths(x, y), + regexp = paste0( + "^... objects must be all zero length or the same length ", + "with some of length of 1 but not lengths 0 and 3\\.$" + ) + ) +}) + +test_that("throws error when vector have two different lengths", { + x <- c(4, 5) + y <- c(1, 2, 3) + expect_error( + chk_compatible_lengths(x, y), + regexp = paste0( + "^... objects must be all zero length or the same length ", + "with some of length of 1 but not lengths 2 and 3\\.$" + ) + ) +}) + +test_that("throws error when vector have three different lengths", { + x <- c(4, 5) + z <- c(6, 7, 8, 9) + y <- c(1, 2, 3) + expect_error( + chk_compatible_lengths(x, z, y, x_name = "`test vectors`"), + regexp = paste0( + "^`test vectors` must be all zero length or the same length ", + "with some of length of 1 but not lengths 2, 3 and 4\\.$" + ) + ) +}) diff --git a/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-complex-number.R b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-complex-number.R new file mode 100644 index 00000000..a48e9ac0 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-complex-number.R @@ -0,0 +1,15 @@ +test_that("vld_complex_number", { + expect_false(vld_complex_number(complex(0))) + expect_false(vld_complex_number(NA_complex_)) + expect_true(vld_complex_number(1i)) + expect_true(vld_complex_number(as.complex(1))) + expect_false(vld_complex_number(as.complex(c(1, 2)))) + expect_false(vld_complex_number(TRUE)) +}) + +test_that("chk_complex_number", { + expect_identical(chk_complex_number(as.complex(1)), as.complex(1)) + expect_invisible(chk_complex_number(as.complex(1))) + expect_chk_error(chk_complex_number(TRUE), "^`TRUE` must be a complex number [(]non-missing complex scalar[)][.]$") + expect_chk_error(chk_complex_number(TRUE, x_name = 1L), "^1 must be a complex number [(]non-missing complex scalar[)][.]$") +}) diff --git a/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-complex.R b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-complex.R new file mode 100644 index 00000000..18ea246c --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-complex.R @@ -0,0 +1,17 @@ +test_that("vld_complex", { + expect_true(vld_complex(as.complex(1))) + expect_true(vld_complex(as.complex(1:2))) + expect_true(vld_complex(complex(0))) + expect_true(vld_complex(NA_complex_)) + expect_false(vld_complex(1)) + expect_false(vld_complex(TRUE)) +}) + +test_that("chk_complex", { + expect_identical(chk_complex(as.complex(1)), as.complex(1)) + expect_invisible(chk_complex(as.complex(1))) + expect_chk_error( + chk_complex(TRUE), + "^`TRUE` must be complex[.]$" + ) +}) diff --git a/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-count.R b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-count.R new file mode 100644 index 00000000..30a29995 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-count.R @@ -0,0 +1,16 @@ +test_that("vld_count", { + expect_true(vld_count(1)) + expect_true(vld_count(0)) + expect_true(vld_count(100L)) + expect_false(vld_count(0.5)) + expect_false(vld_count(-1L)) + expect_false(vld_count(NA_integer_)) + expect_false(vld_count(integer(0))) +}) + +test_that("chk_count", { + expect_identical(chk_count(1), 1) + expect_invisible(chk_count(1)) + expect_chk_error(chk_count(1.1), "^`1.1` must be a count [(]non-negative non-missing integer scalar or double equivalent[)][.]$") + expect_chk_error(chk_count(1.1, x_name = 1L), "^1 must be a count [(]non-negative non-missing integer scalar or double equivalent[)][.]$") +}) diff --git a/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-data.R b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-data.R new file mode 100644 index 00000000..3065f83a --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-data.R @@ -0,0 +1,15 @@ +test_that("vld_data", { + expect_false(vld_data(1)) + expect_false(vld_data(array(1))) + expect_true(vld_data(data.frame())) + expect_true(vld_data(data.frame(x = 1))) +}) + +test_that("chk_data", { + expect_identical(chk_data(data.frame()), data.frame()) + expect_invisible(chk_data(data.frame())) + expect_chk_error( + chk_data(1), + "^`1` must be a data[.]frame[.]$" + ) +}) diff --git a/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-date-time.R b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-date-time.R new file mode 100644 index 00000000..e95c2c19 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-date-time.R @@ -0,0 +1,31 @@ +test_that("vld_date_time", { + expect_false(vld_date_time(NULL)) + expect_false(vld_date_time(Sys.time()[-1])) + expect_false(vld_date_time(Sys.time()[c(1, 1)])) + expect_true(vld_date_time(Sys.time())) +}) + +test_that("chk_date_time", { + time <- Sys.time() + expect_identical(chk_date_time(time), time) + expect_invisible(chk_date_time(Sys.time())) + expect_chk_error(chk_date_time(1), "^`1` must be a date time [(]non-missing POSIXct scalar[)][.]$") + expect_chk_error(chk_date(1, x_name = 1), "^1 must be a date [(]non-missing Date scalar[)][.]$") +}) + +test_that("vld_datetime", { + rlang::local_options(lifecycle_verbosity = "quiet") + expect_false(vld_datetime(NULL)) + expect_false(vld_datetime(Sys.time()[-1])) + expect_false(vld_datetime(Sys.time()[c(1, 1)])) + expect_true(vld_datetime(Sys.time())) +}) + +test_that("chk_datetime", { + rlang::local_options(lifecycle_verbosity = "quiet") + time <- Sys.time() + expect_identical(chk_date_time(time), time) + expect_invisible(chk_datetime(Sys.time())) + expect_chk_error(chk_datetime(1), "^`1` must be a date time [(]non-missing POSIXct scalar[)][.]$") + expect_chk_error(chk_date(1, x_name = 1), "^1 must be a date [(]non-missing Date scalar[)][.]$") +}) diff --git a/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-date.R b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-date.R new file mode 100644 index 00000000..f1b96c17 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-date.R @@ -0,0 +1,14 @@ +test_that("vld_date", { + expect_false(vld_date(NULL)) + expect_false(vld_date(as.Date("2000-01-01")[-1])) + expect_false(vld_date(as.Date("2000-01-01")[c(1, 1)])) + expect_true(vld_date(as.Date("2000-01-01"))) +}) + +test_that("chk_date", { + expect_identical(chk_date(as.Date("2000-01-01")), as.Date("2000-01-01")) + expect_invisible(chk_date(as.Date("2000-01-01"))) + + expect_chk_error(chk_date(1), "^`1` must be a date [(]non-missing Date scalar[)][.]$") + expect_chk_error(chk_date(1, x_name = "2001-02-04"), "^2001-02-04 must be a date [(]non-missing Date scalar[)][.]$") +}) diff --git a/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-dbl.R b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-dbl.R new file mode 100644 index 00000000..850b866f --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-dbl.R @@ -0,0 +1,25 @@ +test_that("vld_dbl", { + rlang::local_options(lifecycle_verbosity = "quiet") + + lifecycle::expect_deprecated(vld_dbl(1)) + + expect_true(vld_dbl(1)) + expect_false(vld_dbl(matrix(c(1, 2)))) + expect_true(vld_dbl(dbl(0))) + expect_true(vld_dbl(NA_real_)) + expect_false(vld_dbl(1L)) + expect_false(vld_dbl(TRUE)) +}) + +test_that("chk_dbl", { + rlang::local_options(lifecycle_verbosity = "quiet") + + lifecycle::expect_deprecated(chk_dbl(1)) + + expect_identical(chk_dbl(1), 1) + expect_invisible(chk_dbl(1)) + expect_chk_error( + chk_dbl(TRUE), + "^`TRUE` must be double [(]real[)] scalar[.]$" + ) +}) diff --git a/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-double.R b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-double.R new file mode 100644 index 00000000..9b0b770f --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-double.R @@ -0,0 +1,17 @@ +test_that("vld_double", { + expect_true(vld_double(1)) + expect_true(vld_double(matrix(c(1, 2)))) + expect_true(vld_double(double(0))) + expect_true(vld_double(NA_real_)) + expect_false(vld_double(1L)) + expect_false(vld_double(TRUE)) +}) + +test_that("chk_double", { + expect_identical(chk_double(1), 1) + expect_invisible(chk_double(1)) + expect_chk_error( + chk_double(TRUE), + "^`TRUE` must be double[.]$" + ) +}) diff --git a/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-environment.R b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-environment.R new file mode 100644 index 00000000..b0d896db --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-environment.R @@ -0,0 +1,13 @@ +test_that("vld_environment", { + expect_false(vld_environment(1)) + expect_false(vld_environment(list(1))) + expect_true(vld_environment(.GlobalEnv)) + expect_true(vld_environment(environment())) +}) + +test_that("chk_environment", { + expect_identical(chk_environment(.GlobalEnv), .GlobalEnv) + expect_invisible(chk_environment(.GlobalEnv)) + expect_chk_error(chk_environment(1), "^`1` must be an environment[.]$") + expect_chk_error(chk_environment(list(1), x_name = 1), "^1 must be an environment[.]$") +}) diff --git a/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-factor.R b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-factor.R new file mode 100644 index 00000000..2b88df91 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-factor.R @@ -0,0 +1,17 @@ +test_that("vld_factor", { + expect_true(vld_factor(factor("1"))) + expect_true(vld_factor(factor(0))) + expect_true(vld_factor(factor(NA))) + expect_false(vld_factor(NA_character_)) + expect_false(vld_factor(1)) + expect_false(vld_factor(TRUE)) +}) + +test_that("chk_factor", { + expect_identical(chk_factor(factor("1")), factor("1")) + expect_invisible(chk_factor(factor("1"))) + expect_chk_error( + chk_factor(TRUE), + "^`TRUE` must be factor[.]$" + ) +}) diff --git a/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-file.R b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-file.R new file mode 100644 index 00000000..ecc0e6d2 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-file.R @@ -0,0 +1,96 @@ +test_that("vld_file", { + expect_false(vld_file(character(0))) + expect_false(vld_file(tempdir())) + file <- withr::local_tempfile() + expect_false(vld_file(file)) + + write.csv(data.frame(x = 1), file) + expect_true(vld_file(file)) + expect_false(vld_file(dirname(file))) +}) + +test_that("chk_file", { + expect_chk_error( + chk_file(character(0)), + "^`character[(]0[)]` must be a string [(]non-missing character scalar[)][.]$" + ) + + expect_chk_error(chk_file(tempdir()), "`tempdir[(][)]` must specify a file [(]'.*' is a directory[)][.]$") + + file1 <- withr::local_tempfile(fileext = ".csv") + expect_chk_error( + chk_file(file1), + "^`file1` must specify an existing file [(]'.*[.]csv' can't be found[)][.]$" + ) + write.csv(data.frame(x = 1), file1) + expect_identical(chk_file(file1), file1) + expect_invisible(chk_file(file1)) + + expect_identical(chk_all(character(0), chk_file), character(0), chk_file) + expect_invisible(chk_all(character(0), chk_file)) + expect_identical(chk_all(file1, chk_file), file1, chk_file) + expect_invisible(chk_all(file1, chk_file)) + expect_identical(chk_all(c(file1, file1), chk_file), c(file1, file1), chk_file) + expect_invisible(chk_all(c(file1, file1), chk_file)) + expect_chk_error( + chk_all(c(file1, p0(file1, "b")), chk_file, x_name = "`vec`"), + "^All elements of `vec` must specify an existing file [(]'.*[.]csvb' can't be found[)][.]$" + ) +}) + +test_that("vld_dir", { + expect_false(vld_dir(character(0))) + expect_true(vld_dir(tempdir())) + expect_false(vld_dir(tempfile())) +}) + +test_that("chk_dir", { + expect_identical(chk_dir(tempdir()), tempdir()) + expect_invisible(chk_dir(tempdir())) + expect_chk_error( + chk_dir(tempfile()), + "^`tempfile[(][)]` must specify an existing directory [(]'.*' can't be found[)][.]$" + ) + + file1 <- withr::local_tempfile(fileext = ".csv") + write.csv(data.frame(x = 1), file1) + expect_chk_error( + chk_dir(file1), + "^`file1` must specify a directory [(]'.*[.]csv' is a file[)][.]$" + ) + + path <- withr::local_tempdir() + unlink(path, recursive = TRUE) + expect_chk_error(chk_dir(path), "^`path` must specify an existing directory [(]'.*' can't be found[)][.]$") + expect_chk_error(chk_dir(1), "^`1` must be a string [(]non-missing character scalar[)][.]$") + expect_invisible(chk_all(c(tempdir(), tempdir()), chk_dir)) + expect_chk_error( + chk_all(c(tempdir(), p0(tempdir(), "b")), chk_dir, x_name = "`vec`"), + "^All elements of `vec` must specify an existing directory [(]'.*b' can't be found[)][.]$" + ) +}) + +test_that("vld_ext", { + expect_false(vld_ext(character(0))) + expect_false(vld_ext("file.pdf", "PDF")) + expect_false(vld_ext(c("file.pdf", "file.pdf"), "pdf")) + expect_true(vld_ext("file.pdf", "pdf")) + expect_true(vld_ext("file.png", c("pdf", "png"))) +}) + +test_that("chk_ext", { + expect_chk_error( + chk_ext(character(0)), + "^`character[(]0[)]` must be a string [(]non-missing character scalar[)][.]$" + ) + expect_chk_error( + chk_ext("file.pdf", "png"), + "^`\"file.pdf\"` must have extension 'png' [(]not 'pdf'[)][.]$" + ) + expect_chk_error( + chk_ext("file.pdf", c("png", "PDF")), + "^`\"file.pdf\"` must have extension 'png' or 'PDF' [(]not 'pdf'[)][.]$" + ) + expect_identical(chk_ext("file.pdf", "pdf"), "file.pdf", "pdf") + expect_invisible(chk_ext("file.pdf", "pdf")) +}) diff --git a/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-identical.R b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-identical.R new file mode 100644 index 00000000..cec9953d --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-identical.R @@ -0,0 +1,106 @@ +test_that("vld_identical", { + expect_true(vld_identical(1, 1)) + expect_true(vld_identical(1L, 1L)) + expect_false(vld_identical(1, 1L)) + expect_false(vld_identical(1L, 1)) + + expect_true(vld_identical(c(1L), 1L)) + expect_false(vld_identical(c(x = 1L), 1L)) + expect_false(vld_identical(1L, c(x = 1L))) +}) + +test_that("chk_identical", { + expect_identical(chk_identical(1, 1), 1, 1) + expect_invisible(chk_identical(1, 1)) + expect_chk_error( + chk_identical(1L, 2), + "^`1L` must be identical to 2[.]\n" + ) + + expect_chk_error(chk_identical(1, 1L), "^`1` must be identical to 1L[.]\n") + expect_chk_error( + chk_identical(1, 1:10), + "^`1` must be identical to the y object of class [<]int[>][.]\n" + ) + expect_chk_error( + chk_identical(1, 1:100), + "^`1` must be identical to the y object of class [<]int[>][.]\n" + ) + expect_chk_error( + chk_identical(1, c(1, 5, 1, 9)), + "^`1` must be identical to the y object of class [<]dbl[>][.]\n" + ) + expect_chk_error( + chk_identical(1, 2, x_name = 2), + "^2 must be identical to 2[.]\n" + ) +}) + + +test_that("vld_equal", { + expect_true(vld_equal(1, 1)) + expect_true(vld_equal(1L, 1L)) + expect_true(vld_equal(1, 1L)) + expect_true(vld_equal(1L, 1)) + + expect_true(vld_equal(c(1L), 1L)) + expect_false(vld_equal(c(x = 1L), 1L)) + expect_false(vld_equal(1L, c(x = 1L))) + + expect_true(vld_equal(1, 1.00000001)) + expect_true(vld_equal(1, 1.001, 0.01)) + expect_false(vld_equal(1, 1.001, 0.0001)) +}) + +test_that("chk_equal", { + expect_identical(chk_equal(1, 1), 1, 1) + expect_invisible(chk_equal(1, 1)) + expect_chk_error( + chk_equal(c(x = 1L), 1L), + "^`c[(]x = 1L[)]` must be equal to 1L[.]\n" + ) + expect_chk_error( + chk_equal(1L, 2), + "^`1L` must be equal to 2[.]\n" + ) + expect_chk_error( + chk_equal(1, c(1, 5, 1, 9)), + "^`1` must be equal to the y object of class [<]dbl[>][.]\n" + ) + expect_chk_error( + chk_equal(1, 2, x_name = 2), + "^2 must be equal to 2[.]\n" + ) +}) + +test_that("vld_equivalent", { + expect_true(vld_equivalent(1, 1)) + expect_true(vld_equivalent(1L, 1L)) + expect_true(vld_equivalent(1, 1L)) + expect_true(vld_equivalent(1L, 1)) + + expect_true(vld_equivalent(c(1L), 1L)) + expect_true(vld_equivalent(c(x = 1L), 1L)) + expect_true(vld_equivalent(c(x = 1L), 1L)) + expect_true(vld_equivalent(1L, c(x = 1L))) + expect_true(vld_equivalent(1L, c(x = 1L))) + + expect_true(vld_equivalent(1, 1.00000001)) + expect_true(vld_equivalent(1, 1.001, 0.01)) + + expect_false(vld_equivalent(1, 1.001, 0.0001)) +}) + +test_that("chk_equivalent", { + expect_identical(chk_equivalent(1, 1), 1, 1) + expect_invisible(chk_equivalent(1, 1)) + expect_chk_error(chk_equivalent(1, 1.001, 0.0001), c("^`1` must be equivalent to 1[.]001[.]\n")) + expect_chk_error( + chk_equivalent(1, c(1, 5, 1, 9)), + "^`1` must be equivalent to the y object of class [<]dbl[>][.]\n" + ) + expect_chk_error( + chk_equivalent(1, 2, x_name = 2), + "^2 must be equivalent to 2[.]\n" + ) +}) diff --git a/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-integer.R b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-integer.R new file mode 100644 index 00000000..46a5e18a --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-integer.R @@ -0,0 +1,17 @@ +test_that("vld_integer", { + expect_true(vld_integer(1L)) + expect_true(vld_integer(matrix(1:4))) + expect_true(vld_integer(integer(0))) + expect_true(vld_integer(NA_integer_)) + expect_false(vld_integer(1)) + expect_false(vld_integer(TRUE)) +}) + +test_that("chk_integer", { + expect_identical(chk_integer(1L), 1L) + expect_invisible(chk_integer(1L)) + expect_chk_error( + chk_integer(TRUE), + "^`TRUE` must be integer[.]$" + ) +}) diff --git a/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-is.R b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-is.R new file mode 100644 index 00000000..b34dc379 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-is.R @@ -0,0 +1,28 @@ +test_that("vld_is", { + expect_true(vld_is(1, "numeric")) + expect_false(vld_is(1L, "numeric")) + expect_true(vld_is(1L, "integer")) + + x <- list() + class(x) <- c("a", "b") + expect_true(vld_is(x, "a")) + expect_true(vld_is(x, "b")) +}) + +test_that("chk_is", { + expect_identical(chk_is(1L, "integer"), 1L, "integer") + expect_invisible(chk_is(1L, "integer")) + expect_chk_error(chk_is(1, "integer"), "^`1` must inherit from class 'integer'[.]$") + expect_chk_error( + chk_is(matrix(1), "numeric"), + "`matrix[(]1[)]` must inherit from class 'numeric'[.]$" + ) + x <- list() + class(x) <- c("a", "b") + expect_chk_error(chk_is(x, "c"), "`x` must inherit from class 'c'") + expect_chk_error(chk_is(x, "c", x_name = "c"), "C must inherit from class 'c'") + + foo <- 1 + class(foo) <- "a" + expect_chk_error(chk_is(foo, c("b", "c")), "`foo` must inherit from class 'b' or 'c'.") +}) diff --git a/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-join.R b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-join.R new file mode 100644 index 00000000..ae6006c2 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/tests/testthat/test-chk-join.R @@ -0,0 +1,49 @@ +test_that("vld_join", { + expect_true(vld_join(data.frame(z = 1), data.frame(z = 1:2), by = "z")) + expect_false(vld_join(data.frame(z = 1), data.frame(z = 2), by = "z")) + expect_true(vld_join(data.frame(z = 1:2), data.frame(z = 1:2), by = "z")) +}) + +test_that("vld_join with by = NULL", { + expect_false(vld_join(data.frame(z = 1), data.frame(z = 1:2), by = NULL)) +}) + +test_that("vld_join with names", { + expect_true(vld_join(data.frame(z = 1), data.frame(a = 1:2), by = c(z = "a"))) + expect_false(vld_join(data.frame(z = 1), data.frame(a = 2), by = c(z = "a"))) + expect_error( + vld_join(data.frame(z = 1), data.frame(a = 2), by = c(a = "z")), + "undefined columns selected" + ) + expect_true(vld_join(data.frame(z = 1, z2 = 2), data.frame(z = 1:2, z2 = 2:1), by = "z")) + expect_true(vld_join(data.frame(z = 1, z2 = 2), data.frame(z = 1:2, z2 = 2:1), by = c("z", "z2"))) + expect_true(vld_join(data.frame(z = 1, z2 = 2), data.frame(z = 1:2, z2 = 1:2), by = "z")) + expect_false(vld_join(data.frame(z = 1, z2 = 2), data.frame(z = 1:2, z2 = 1:2), by = c("z", "z2"))) +}) + +test_that("vld_join with zero length", { + expect_true(vld_join(data.frame(z = numeric(0)), data.frame(z = 2), by = c("z"))) + expect_true(vld_join(data.frame(z = numeric(0)), data.frame(z = numeric(0)), by = c("z"))) + expect_false(vld_join(data.frame(z = 1), data.frame(z = numeric(0)), by = c("z"))) +}) + +test_that("vld_join with missing values", { + expect_false(vld_join(data.frame(z = NA_integer_), data.frame(z = 2), by = c("z"))) + expect_false(vld_join(data.frame(z = 2), data.frame(z = NA_integer_), by = c("z"))) + expect_true(vld_join(data.frame(z = NA_integer_), data.frame(z = NA_integer_), by = c("z"))) +}) + +test_that("chk_join", { + expect_identical( + chk_join(data.frame(z = 1), data.frame(z = 1), by = "z"), + chk_join(data.frame(z = 1), data.frame(z = 1), by = "z") + ) + expect_invisible(chk_join(data.frame(z = 1), data.frame(z = 1), by = "z")) +}) + +test_that("chk_join", { + expect_chk_error( + chk_join(data.frame(z = 1), data.frame(z = 2), by = "z"), + "^All rows in `data.frame[(]z [=] 1[)]` must match at least one in the y object of class + %\VignetteIndexEntry{chk Families} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + +```{r, include = FALSE} +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#>" +) +library(chk) +``` + +## Introduction +The `vld_` functions are used within the `chk_` functions. +The `chk_` functions (and their `vld_` equivalents) can be divided into the following families. + +In the code in this examples, we will use `vld_*` functions + +If you want to learn more about the logic behind some of the functions explained here, we recommend reading the book [Advanced R](https://adv-r.hadley.nz/) (Wickham, 2019). + +For reasons of space, the `x_name = NULL` argument is not shown. +For a more simplified list of the `chk` functions, you can see the [Reference](https://poissonconsulting.github.io/chk/reference/index.html) section. + +## `chk_` Functions +### Overview + +```{r chk_, echo = FALSE, out.width= "100%", fig.align='center', fig.alt = "Classification of the chk functions by family"} +knitr::include_graphics("chk_diagram_II.png") +``` + +### Missing Input Checker +Check if the function input is missing or not + +`chk_missing` function uses `missing()` +to check if an argument has been left out when the function is called. + +Function | Code +:- | :--- +`chk_missing()` | `missing()` +`chk_not_missing()` | `!missing()` + +### `...` Checker +Check if the function input comes from `...` (`dot-dot-dot`) or not + +The functions `chk_used(...)` and `chk_unused(...)` check +if any arguments have been provided through `...` (called `dot-dot-dot` or ellipsis), which is commonly used in R to allow a variable number of arguments. + +Function | Code +:- | :--- +`chk_used(...)` | `length(list(...)) != 0L` +`chk_unused(...)` | `length(list(...)) == 0L` + +### External Data Source Checkers +Check if the function input is a valid external data source. + +These `chk` functions check the existence of a file, the validity of its extension, and the existence of a directory. + +Function | Code +:- | :--- +`chk_file(x)` | `vld_string(x) && file.exists(x) && !dir.exists(x)` +`chk_ext(x, ext)` | `vld_string(x) && vld_subset(tools::file_ext(x), ext)` +`chk_dir(x)` | `vld_string(x) && dir.exists(x)` + +### NULL checker +Check if the function input is NULL or not + +Function | Code +:- | :--- +`chk_null(x)` | `is.null(x)` +`chk_not_null(x)` | `!is.null(x)` + +### Scalar Checkers +Check if the function input is a scalar. +In R, scalars are vectors of length 1. + +Function | Code +:- | :------ +`chk_scalar(x)` | `length(x) == 1L` + +The following functions check if the functions inputs are vectors of length 1 of a particular data type. +Each data type has a special syntax to create an individual value or "scalar". + +Function | Code +:- | :------ +`chk_string(x)` | `is.character(x) && length(x) == 1L && !anyNA(x)` +`chk_number(x)` | `is.numeric(x) && length(x) == 1L && !anyNA(x)` + +For logical data types, you can check flags using `chk_flag()`, which considers `TRUE` or `FALSE` as possible values, or use `chk_lgl()` to verify if a scalar is of type logical, including NA as element. + +Function | Code +:- | :- +`chk_flag(x)` | `is.logical(x) && length(x) == 1L && !anyNA(x)` +`chk_lgl(x)` | `is.logical(x) && length(x) == 1L` + +It is also possible to check if the user-provided argument is only `TRUE` or only `FALSE`: + +Function | Code +:- | :- +`chk_true(x)` | `is.logical(x) && length(x) == 1L && !anyNA(x) && x` +`chk_false(x)` | `is.logical(x) && length(x) == 1L && !anyNA(x) && !x` + +### Date or DateTime Checkers +Check if the function input is of class Date or DateTime + +Date and datetime classes can be checked with `chk_date` and `chk_datetime`. + +Function | Code +:- | :------ +`chk_date(x)` | `inherits(x, "Date") && length(x) == 1L && !anyNA(x)` +`chk_date_time(x)` | `inherits(x, "POSIXct") && length(x) == 1L && !anyNA(x)` + +### Time Zone Checker +Also you can check the time zone with `chk_tz()`. +The available time zones can be retrieved using the function `OlsonNames()`. + +Function | Code +:- | :------ +`chk_tz(x)` | `is.character(x) && length(x) == 1L && !anyNA(x) && x %in% OlsonNames()` + +#### Data Structure Checker +Check if the function input has a specific data structure. + +Vectors are a family of data types that come in two forms: atomic vectors and lists. +When vectors consist of elements of the same data type, they can be considered atomic, matrices, or arrays. +The elements in a list, however, can be of different types. + +To check if a function argument is a vector you can use `chk_vector()`. + +Function | Code +:- | :--- +`chk_vector(x)` | `is.atomic(x) && !is.matrix(x) && !is.array(x)) || is.list(x)` + +Pay attention that `chk_vector()` and `vld_vector()` +are different from `is.vector()`, that will return FALSE if the vector has any attributes except names. + +```{r} +vector <- c(1, 2, 3) +is.vector(vector) # TRUE +vld_vector(vector) # TRUE + +attributes(vector) <- list("a" = 10, "b" = 20, "c" = 30) +is.vector(vector) # FALSE +vld_vector(vector) # TRUE +``` +Function | Code +:- | :--- +`chk_atomic(x)` | `is.atomic(x)` + +Notice that `is.atomic` is true for the types logical, integer, numeric, complex, character and raw. Also, it is TRUE for NULL. + +```{r} +vector <- c(1, 2, 3) +is.atomic(vector) # TRUE +vld_vector(vector) # TRUE + +is.atomic(NULL) # TRUE +vld_vector(NULL) # TRUE +``` + +The dimension attribute converts vectors into matrices and arrays. + +Function | Code +:- | :--- +`chk_array(x)` | `is.array(x)` +`chk_matrix(x)` | `is.matrix(x)` + +When a vector is composed by heterogeneous data types, can be a list. +Data frames are among the most important S3 vectors, constructed on top of lists. + +Function | Code +:- | :--- +`chk_list(x)` | `is.list()` +`chk_data(x)` | `inherits(x, "data.frame")` + +Be careful not to confuse the function `chk_data` with `check_data`. +Please read the `check_` functions section below and the function documentation. + +### Data Type Checkers +Check if the function input has a data type. +You can use the function `typeof()` to confirm the data type. + +Function | Code +:- | :--- +`chk_environment(x)` | `is.environment(x)` +`chk_logical(x)` | `is.logical(x)` +`chk_character(x)` | `is.character(x)` + +For numbers there are four functions. +R differentiates between doubles (`chk_double()`) and integers (`chk_integer()`). +You can also use the generic function `chk_numeric()`, which will detect both. +The third type of number is complex (`chk_complex()`). + +Function | Code +:- | :--- +`chk_numeric(x)` | `is.numeric(x)` +`chk_double(x)` | `is.double(x)` +`chk_integer(x)` | `is.integer(x)` +`chk_complex(x)` | `is.complex(x)` + +Consider that to explicitly create an integer in R, you need to use the suffix `L`. + +```{r} +vld_numeric(33) # TRUE + +vld_double(33) # TRUE +vld_integer(33) # FALSE + +vld_integer(33L) # TRUE +``` + + +### Whole Number Checkers +These functions accept whole numbers, whether they are explicitly integers or double types without fractional parts. + +Function | Code +:- | :--- +`chk_whole_numeric` | `is.integer(x) || (is.double(x) && vld_true(all.equal(x[!is.na(x)], trunc(x[!is.na(x)]))))` +`chk_whole_number` | `vld_number(x) && (is.integer(x) || vld_true(all.equal(x, trunc(x))))` +`chk_count` | `vld_whole_number(x) && x >= 0` + +If you want to consider both 3.0 and 3L as integers, it is safer to use the function `chk_whole_numeric`. +Here, `x` is valid if it's an integer or a double that can be converted to an integer without changing its value. + +```{r} +# Integer vector +vld_whole_numeric(c(1L, 2L, 3L)) # TRUE + +# Double vector representing whole numbers +vld_whole_numeric(c(1.0, 2.0, 3.0)) # TRUE + +# Double vector with fractional numbers +vld_whole_numeric(c(1.0, 2.2, 3.0)) # FALSE +``` + +The function `chk_whole_number` is similar to `chk_whole_numeric`. +`chk_whole_number` checks if the number is of `length(x) == 1L` + +```{r} +# Integer vector +vld_whole_numeric(c(1L, 2L, 3L)) # TRUE +vld_whole_number(c(1L, 2L, 3L)) # FALSE +vld_whole_number(c(1L)) # TRUE +``` + +`chk_count()` is a special case of `chk_whole_number`, differing in that it ensures values are non-negative whole numbers. + +```{r} +# Positive integer +vld_count(1) #TRUE +# Zero +vld_count(0) # TRUE +# Negative number +vld_count(-1) # FALSE +# Non-whole number +vld_count(2.5) # FALSE +``` + +### Factor Checker +Check if the function input is a factor + +Function | Code +:- | :------ +`chk_factor` | `is.factor(x)` +`chk_character_or_factor` | `is.character(x) || is.factor(x)` + +Factors can be specially confusing for users, because despite they are displayed as characters are built in top of integer vectors. + +`chk` provides the function `chk_character_or_factor()` that allows detecting if the argument that the user is providing contains strings. + +```{r} +# Factor with specified levels + +vector_fruits <- c("apple", "banana", "apple", "orange", "banana", "apple") + +factor_fruits <- factor(c("apple", "banana", "apple", "orange", "banana", "apple"), + levels = c("apple", "banana", "orange")) + + +is.factor(factor_fruits) # TRUE +vld_factor(factor_fruits) # TRUE + +is.character(factor_fruits) # FALSE +vld_character(factor_fruits) # FALSE + +vld_character_or_factor(factor_fruits) # TRUE + +``` + + +### All Elements Checkers +Check if the function input has a characteristic shared by all its elements. + +If you want to apply any of the previously defined functions for `length(x) == 1L` to the elements of a vector, you can use `chk_all()`. + +Function | Code +:- | :--- +`chk_all(x, chk_fun, ...)` | `all(vapply(x, chk_fun, TRUE, ...))` + +```{r} +vld_all(c(TRUE, TRUE, FALSE), chk_lgl) # FALSE +``` + +### Function Checker +Check if the function input is another function + +`formals` refers to the count of the number of formal arguments + +Function | Code +:- | :------ +`chk_function` | `is.function(x) && (is.null(formals) || length(formals(x)) == formals)` + +```{r} +vld_function(function(x) x, formals = 1) # TRUE +vld_function(function(x, y) x + y, formals = 1) # FALSE +vld_function(function(x, y) x + y, formals = 2) # TRUE +``` + +### Name Checkers +Check if the function input has names and are valid `chk_named` function works with vectors, lists, data frames, and matrices that have named columns or rows. +Do not confuse with `check_names`. + +`chk_valid_name` function specifically designed to check if the elements of a character vector are valid R names. +If you want to know what is considered a valid name, +please refer to the documentation for the `make.names` function. + +Function | Code +:- | :-- +`chk_named(x)` | `!is.null(names(x))` +`chk_valid_name(x)` | `identical(make.names(x[!is.na(x)]), as.character(x[!is.na(x)]))` + +```{r} + +vld_valid_name(c("name1", NA, "name_2", "validName")) # TRUE +vld_valid_name(c(1, 2, 3)) # FALSE + + +vld_named(data.frame(a = 1:5, b = 6:10)) # TRUE +vld_named(list(a = 1, b = 2)) # TRUE +vld_named(c(a = 1, b = 2)) # TRUE +vld_named(c(1, 2, 3)) # FALSE + +``` + +### Range Checkers +Check if the function input is part of a range of values. +The function input should be numeric. + +Function | Code +:- | :--- +`chk_range(x, range = c(0, 1))` | `all(x[!is.na(x)] >= range[1] & x[!is.na(x)] <= range[2])` +`chk_lt(x, value = 0)` | `all(x[!is.na(x)] < value)` +`chk_lte(x, value = 0)` | `all(x[!is.na(x)] <= value)` +`chk_gt(x, value = 0)` | `all(x[!is.na(x)] > value)` +`chk_gte(x, value = 0)` | `all(x[!is.na(x)] >= value)` + +### Equal Checkers +Check if the function input is equal or similar to a predefined object. + +The functions `chk_identical()`, `chk_equal()`, and `chk_equivalent()` are used to compare two objects, but they differ in how strict the comparison is. + +`chk_equal` and `chk_equivalent`checks if x and y are numerically equivalent within a specified tolerance, but `chk_equivalent` ignores differences in attributes. + +Function | Code +:-- | :- +`chk_identical(x, y)` | `identical(x, y)` +`chk_equal(x, y, tolerance = sqrt(.Machine$double.eps))` | `vld_true(all.equal(x, y, tolerance))` +`chk_equivalent(x, y, tolerance = sqrt(.Machine$double.eps))` | `vld_true(all.equal(x, y, tolerance, check.attributes = FALSE))` + +In the case you want to compare the elements of a vector, you can use the `check_all_*` functions. + +Function | Code +:-- | :-- +`chk_all_identical(x)` | `length(x) < 2L || all(vapply(x, vld_identical, TRUE, y = x[[1]]))` +`chk_all_equal(x, tolerance = sqrt(.Machine$double.eps))` | `length(x) < 2L || all(vapply(x, vld_equal, TRUE, y = x[[1]], tolerance = tolerance))` +`chk_all_equivalent(x, tolerance = sqrt(.Machine$double.eps))` | `length(x) < 2L || all(vapply(x, vld_equivalent, TRUE, y = x[[1]], tolerance = tolerance))` + +```{r} +vld_all_identical(c(1, 2, 3)) # FALSE +vld_all_identical(c(1, 1, 1)) # TRUE +vld_identical(c(1, 2, 3), c(1, 2, 3)) # TRUE + +vld_all_equal(c(0.1, 0.12, 0.13)) +vld_all_equal(c(0.1, 0.12, 0.13), tolerance = 0.2) +vld_equal(c(0.1, 0.12, 0.13), c(0.1, 0.12, 0.13)) # TRUE +vld_equal(c(0.1, 0.12, 0.13), c(0.1, 0.12, 0.4), tolerance = 0.5) # TRUE + +x <- c(0.1, 0.1, 0.1) +y <- c(0.1, 0.12, 0.13) +attr(y, "label") <- "Numbers" +vld_equal(x, y, tolerance = 0.5) # FALSE +vld_equivalent(x, y, tolerance = 0.5) # TRUE +``` + +### Order Checker +Check if the function input are numbers in increasing order +`chk_sorted` function checks if `x` is sorted in non-decreasing order, ignoring any NA values. + +Function | Code +:- | :-- +`chk_sorted(x)` | `!is.unsorted(x, na.rm = TRUE)` + +```{r} +# Checking if sorted +vld_sorted(c(1, 2, 3, NA, 4)) # TRUE +vld_sorted(c(3, 1, 2, NA, 4)) # FALSE +``` + +### Set Checkers +Check if the function input is composed by certain elements + +The `setequal` function in R is used to check if two vectors contain exactly the same elements, regardless of the order or number of repetitions. + +Function | Code +:- | :--- +`chk_setequal(x, values)` | `setequal(x, values)` + +```{r} +vld_setequal(c(1, 2, 3), c(3, 2, 1)) # TRUE +vld_setequal(c(1, 2, 3), c(3, 2, 1, 4)) # FALSE +vld_setequal(c(1, 2, 3, 4), c(3, 2, 1)) # FALSE +vld_setequal(c(1, 2), c(1, 1, 1, 1, 1, 1, 2, 1)) # TRUE +``` + +First, the `%in%` function is used to check whether +the elements of a vector `x` are present in a specified set of values. +This returns a logical vector, which is then simplified by `all()`. The `all()` function checks if all values in the vector are TRUE. +If the result is TRUE, it indicates that for `vld_` and `chk_subset()`, all elements in the `x` vector are present in `values`. +Similarly, for `vld_` and `chk_superset()`, it indicates that all elements of `values` are present in `x`. + +Function | Code +:-- | :-- +`chk_subset(x, values)` | `all(x %in% values)` +`chk_not_subset(x, values)` | `!any(x %in% values) || !length(x)` +`chk_superset(x, values)` | `all(values %in% x)` + +```{r} + +# When both function inputs have the same elements, +# all functions return TRUE + +vld_setequal(c(1, 2, 3), c(3, 2, 1)) # TRUE +vld_subset(c(1, 2, 3), c(3, 2, 1)) # TRUE +vld_superset(c(1, 2, 3), c(3, 2, 1)) # TRUE + +vld_setequal(c(1, 2), c(1, 1, 1, 1, 1, 1, 2, 1)) # TRUE +vld_subset(c(1, 2), c(1, 1, 1, 1, 1, 1, 2, 1)) # TRUE +vld_superset(c(1, 2), c(1, 1, 1, 1, 1, 1, 2, 1)) # TRUE + +# When there are elements present in one vector but not the other, +# `vld_setequal()` will return FALSE + +vld_setequal(c(1, 2, 3), c(3, 2, 1, 4)) # FALSE +vld_setequal(c(1, 2, 3, 4), c(3, 2, 1)) # FALSE + +# When some elements of the `x` input are not present in `values`, +# `vld_subset()` returns FALSE +vld_subset(c(1, 2, 3, 4), c(3, 2, 1)) # FALSE +vld_superset(c(1, 2, 3, 4), c(3, 2, 1)) # TRUE + +# When some elements of the `values` input are not present in `x`, +# `vld_superset()` returns FALSE + +vld_subset(c(1, 2, 3), c(3, 2, 1, 4)) # TRUE +vld_superset(c(1, 2, 3), c(3, 2, 1, 4)) # FALSE + +# An empty set is considered a subset of any set, and any set is a superset of an empty set. +vld_subset(c(), c("apple", "banana")) # TRUE +vld_superset(c("apple", "banana"), c()) # TRUE +``` + +`chk_orderset()` validate whether a given set of `values` in a vector x matches a specified set of allowed `values` (represented by `values`) while preserving the order of those values. + +Function | Code +:-- | :-- +`chk_orderset` | `vld_equivalent(unique(x[x %in% values]), values[values %in% x])` + +```{r} +vld_orderset(c("A", "B", "C"), c("A", "B", "C", "D")) # TRUE +vld_orderset(c("C", "B", "A"), c("A", "B", "C", "D")) # FALSE +vld_orderset(c("A", "C"), c("A", "B", "C", "D")) # TRUE +``` + + +### Class Checkers +Check if the function input belongs to a class or type. + +These functions check if `x` is an S3 or S4 object of the specified class. + +Function | Code +:- | :--- +`chk_s3_class(x, class)` | `!isS4(x) && inherits(x, class)` +`chk_s4_class(x, class)` | `isS4(x) && methods::is(x, class)` + +`chk_is()` checks if x inherits from a specified class, regardless of whether it is an S3 or S4 object. + +Function | Code +:- | :--- +`chk_is(x, class)` | `inherits(x, class)` + +### REGEX Checker +Check if the function input matches a regular expression (REGEX). + +`chk_match(x, regexp = ".+")` checks if the regular expression pattern specified by `regexp` matches all the non-missing values in the vector `x`. +If `regexp` it is not specified by the user, `chk_match` checks whether all non-missing values in `x` contain at least one character (regexp = ".+") + +Function | Code +:- | :-- +`chk_match(x, regexp = ".+")` | `all(grepl(regexp, x[!is.na(x)]))` + +### Quality Checkers (Miscellaneous) +Check if the function input meet some user defined quality criteria. + +`chk_not_empty` function checks if the length of the object is not zero. +For a data frame or matrix, the length corresponds to the number of elements (not rows or columns), +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. + +Function | Code +:- | :-- +`chk_not_empty(x)` | `length(x) != 0L` +`chk_not_any_na(x)` | `!anyNA(x)` + +```{r} +vld_not_empty(c()) # FALSE +vld_not_empty(list()) # FALSE +vld_not_empty(data.frame()) # FALSE +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 +``` +The `chk_unique()` function is designed to verify that there are no duplicates elements in a vector. + +Function | Code +:- | :-- +`chk_unique(x, incomparables = FALSE)` | `!anyDuplicated(x, incomparables = incomparables)` + +```{r} +vld_unique(c(1, 2, 3, 4)) # TRUE +vld_unique(c(1, 2, 2, 4)) # FALSE +``` + +The function `chk_length` checks whether the length of `x` is within a specified range. +It ensures that the length is at least equal to `length` and no more than `upper`. +It can be used with vectors, lists and data frames. + +Function | Code +:- | :-- +`chk_length(x, length = 1L, upper = length)` | `length(x) >= length && length(x) <= upper` + +```{r} +vld_length(c(1, 2, 3), length = 2, upper = 5) # TRUE +vld_length(c("a", "b"), length = 3) # FALSE + +vld_length(list(a = 1, b = 2, c = 3), length = 2, upper = 4) # TRUE +vld_length(list(a = 1, b = 2, c = 3), length = 4) # FALSE + +# 2 columns +vld_length(data.frame(x = 1:3, y = 4:6), length = 1, upper = 3) # TRUE +vld_length(data.frame(x = 1:3, y = 4:6), length = 3) # FALSE + +# length of NULL is 0 +vld_length(NULL, length = 0) # TRUE +vld_length(NULL, length = 1) # FALSE +``` + + +Another useful function is `chk_compatible_lenghts()`. +This function helps to check vectors could be 'strictly recycled'. + +```{r} +a <- integer(0) +b <- numeric(0) +vld_compatible_lengths(a, b) # TRUE + +a <- 1 +b <- 2 +vld_compatible_lengths(a, b) # TRUE + +a <- 1:3 +b <- 1:3 +vld_compatible_lengths(a, b) # TRUE + +b <- 1 +vld_compatible_lengths(a, b) # TRUE + +b <- 1:2 +vld_compatible_lengths(a, b) # FALSE + +b <- 1:6 +vld_compatible_lengths(a, b) # FALSE +``` + +The `chk_join()` function is designed to validate whether the number of rows in the resulting data frame from merging two data frames (`x` and `y`) is equal to the number of rows in the first data frame (`x`). +This is useful when you want to ensure that a join operation does not change the number of rows in your main data frame. + +Function | Code +:- | :-- +`chk_join(x, y, by)` | `identical(nrow(x), nrow(merge(x, unique(y[if (is.null(names(by))) by else names(by)]), by = by)))` + +```{r} +x <- data.frame(id = c(1, 2, 3), value_x = c("A", "B", "C")) +y <- data.frame(id = c(1, 2, 3), value_y = c("D", "E", "F")) +vld_join(x, y, by = "id") # TRUE + +# Perform a join that reduces the number of rows +y <- data.frame(id = c(1, 2, 1), value_y = c("D", "E", "F")) +vld_join(x, y, by = "id") # FALSE +``` + + +## `check_` functions + +The `check_` functions combine several `chk_` functions internally. +Read the documentation for each function to learn more about its specific use. + +Function | Description +:- | :-- +`check_values(x, values)` | Checks values and S3 class of an atomic object. +`check_key(x, key = character(0), na_distinct = FALSE)` | Checks if columns have unique rows. +`check_data(x, values, exclusive, order, nrow, key)` | Checks column names, values, number of rows and key for a data.frame. +`check_dim(x, dim, values, dim_name)` | Checks dimension of an object. +`check_dirs(x, exists)` | Checks if all directories exist (or if exists = FALSE do not exist as directories or files). +`check_files(x, exists)` | Checks if all files exist (or if exists = FALSE do not exist as files or directories). +`check_names(x, names, exclusive, order)` | Checks the names of an object. + +## References + +Wickham, H. (2019). Advanced R, Second Edition (2nd ed.). Chapman and Hall/CRC. diff --git a/chk.Rcheck/00_pkg_src/chk/vignettes/chk.Rmd b/chk.Rcheck/00_pkg_src/chk/vignettes/chk.Rmd new file mode 100644 index 00000000..99270112 --- /dev/null +++ b/chk.Rcheck/00_pkg_src/chk/vignettes/chk.Rmd @@ -0,0 +1,142 @@ +--- +title: "Get Started with chk" +output: rmarkdown::html_vignette +vignette: > + %\VignetteIndexEntry{Get Started with chk} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + +```{r, include = FALSE} +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#>" +) +``` + +## Introduction + +R functions and packages are great for sharing code, but it's hard to predict how end-users will implement them. +Users might pass inputs that your function wasn't designed to handle, leading to incorrect results or errors. +For example, if a function expects a numeric vector (e.g., `c(1, 2, 3)`) but receives a character vector (e.g.,` c("1", "2", "3")`), it may return an error. + +The `chk` package provides a set of functions that check user-provided arguments and deliver meaningful error messages to guide users when something goes wrong. +Including `chk`'s specially designed functions when developing your R package will help improve user experience, prevent errors, and make your code more robust by ensuring consistent behavior across different inputs. +This enhances the reliability and reusability of your code. + +Additionally, it can help with performance optimization by ensuring that your functions receive inputs of the appropriate size, thereby avoiding time-consuming calculations. + +## Goal + +`chk` is an R package for developers +to check user-supplied function arguments. + +It is designed to be simple, customizable and fast. + +## `chk` Functions + +Based on the function prefixes, we can classify `chk` functions into three categories: + +1. `chk_` Functions +2. `vld_` Functions +3. `check_` Functions + +### 1. `chk_` Functions + +`chk_` functions check the properties of individual objects. +For example, +`chk_flag(x)` checks whether `x` is a flag, i.e., a non-missing logical vector of length 1. + +`chk_` functions are called for their side-effects, +i.e., they throw an informative error if the object fails the check. +Although do return an invisible copy of the first argument so they can be used in pipes. + +```{r, error=TRUE} +library(chk) +y <- TRUE +chk_flag(y) +y <- NA +chk_flag(y) +``` + +The error messages, which follow the [tidyverse style guide](https://style.tidyverse.org/errors.html), are designed to allow the user to quickly identify the problem with the argument value(s) they are providing. +The errors are [rlang errors](https://rlang.r-lib.org/reference/abort.html) of subclass `'chk_error'`. + +### 2. `vld_` Functions + +Each `chk_` function has a matching `vld_` function +which returns a flag indicating whether the object passed the check. +```{r, error=TRUE} +vld_flag(TRUE) +vld_flag(NA) +``` +The `vld_` functions allow developers to provide their own error messages. +```{r, error=TRUE} +if (!vld_flag(NA)) abort_chk("`NA` is not TRUE or FALSE!!") +``` + +### 3. `check_` Functions + +The `check_` functions are more complex then the `chk_` functions which make them slower but +makes doing some general tests easier. + +## Using chk + +The `chk_` functions are designed to be used within functions. +Consequently, when constructing an error message they use the name of the object that they received +as this is expected to be the name of the argument. +```{r, error = TRUE} +fun1 <- function(x) { + chk_whole_number(x) + # use x +} + +fun1(1) +y <- 1.3 +fun1(x = y) +``` + +If this is not the case, developers can provide a different name using the `x_name` argument. +```{r, error = TRUE} +x <- NA +chk_flag(x, x_name = "`zzz`") +``` + +**IMPORTANT NOTE** + +As the `chk_` (and `vld_`) functions are not expected to be directly exposed to users they don't check any of their arguments (other than the object of interest of course!) to ensure that they are as fast as possible. + + +## Extending chk + +The `chk_flag()` function illustrates the general structure of a `chk_` function. + +``` r +chk_flag +#> function(x, x_name = NULL){ +#> if(vld_flag(x)) return(invisible(x)) +#> if(is.null(x_name)) x_name <- deparse_backtick_chk(substitute(x)) +#> abort_chk(x_name, " must be a flag (TRUE or FALSE)") +#> } +#> +#> +``` + +A `chk_` function initially checks the object (using its `vld_` partner) and if the object passes the check immediately returns an invisible copy of the object. +If, and only if, the object fails the check does the `chk_` function construct and then throw an informative error message. + +The `deparse_backtick_chk()` and `abort_chk()` functions are exported to make it easy for programmers to develop their own `chk_` functions. +The [chk-lgl.R](https://github.com/poissonconsulting/chk/blob/master/R/chk-lgl.R) script illustrates +the general template to use when developing your own `chk_` functions. + +### `abort_chk()` + +The `abort_chk()` function converts multiple arguments to a string using `paste0(..., collapse = '')` and provides number sensitive `sprintf`-like types. +By default it also capitalizes the first character +and adds a missing period. +```{r, error=TRUE} +abort_chk("There %r %n problem director%y%s.", n = 1) +abort_chk("there %r %n ", "problem director%y%s", n = 2) +``` + + diff --git a/chk.Rcheck/00_pkg_src/chk/vignettes/chk_diagram_II.png b/chk.Rcheck/00_pkg_src/chk/vignettes/chk_diagram_II.png new file mode 100644 index 0000000000000000000000000000000000000000..a526a268f2fc4b3e0380d74eb1ebd8a1d0103f0f GIT binary patch literal 283461 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%0A&eeCdD0|Ob9N;jVc5&m&qp4 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%0A6zx1Z?5 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 literal 0 HcmV?d00001 diff --git a/chk.Rcheck/00check.log b/chk.Rcheck/00check.log new file mode 100644 index 00000000..cb97dcdf --- /dev/null +++ b/chk.Rcheck/00check.log @@ -0,0 +1,63 @@ +* using log directory ‘/home/runner/work/chk/chk/chk.Rcheck’ +* using R version 4.5.2 (2025-10-31) +* using platform: x86_64-pc-linux-gnu +* R was compiled by + gcc (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0 + GNU Fortran (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0 +* running under: Ubuntu 24.04.3 LTS +* using session charset: UTF-8 +* using option ‘--no-manual’ +* checking for file ‘chk/DESCRIPTION’ ... OK +* this is package ‘chk’ version ‘0.10.0.9012’ +* package encoding: UTF-8 +* checking package namespace information ... OK +* checking package dependencies ... OK +* checking if this is a source package ... OK +* checking if there is a namespace ... OK +* checking for executable files ... OK +* checking for hidden files and directories ... OK +* checking for portable file names ... OK +* checking for sufficient/correct file permissions ... OK +* checking whether package ‘chk’ can be installed ... OK +* checking installed package size ... OK +* checking package directory ... OK +* checking ‘build’ directory ... OK +* checking DESCRIPTION meta-information ... OK +* checking top-level files ... OK +* checking for left-over files ... OK +* checking index information ... OK +* checking package subdirectories ... OK +* checking code files for non-ASCII characters ... OK +* checking R files for syntax errors ... OK +* checking whether the package can be loaded ... OK +* checking whether the package can be loaded with stated dependencies ... OK +* checking whether the package can be unloaded cleanly ... OK +* checking whether the namespace can be loaded with stated dependencies ... OK +* checking whether the namespace can be unloaded cleanly ... OK +* checking loading without being on the library search path ... OK +* checking dependencies in R code ... OK +* checking S3 generic/method consistency ... OK +* checking replacement functions ... OK +* checking foreign function calls ... OK +* checking R code for possible problems ... OK +* checking Rd files ... OK +* checking Rd metadata ... OK +* checking Rd cross-references ... OK +* checking for missing documentation entries ... OK +* checking for code/documentation mismatches ... OK +* checking Rd \usage sections ... OK +* checking Rd contents ... OK +* checking for unstated dependencies in examples ... OK +* checking installed files from ‘inst/doc’ ... OK +* checking files in ‘vignettes’ ... OK +* checking examples ... OK +* checking for unstated dependencies in ‘tests’ ... OK +* checking tests ... OK + Running ‘testthat.R’ +* checking for unstated dependencies in vignettes ... OK +* checking package vignettes ... OK +* checking re-building of vignette outputs ... OK +* checking for detritus in the temp directory ... OK +* checking for new files in some other directories ... OK +* DONE +Status: OK diff --git a/chk.Rcheck/00install.out b/chk.Rcheck/00install.out new file mode 100644 index 00000000..0a638e47 --- /dev/null +++ b/chk.Rcheck/00install.out @@ -0,0 +1,15 @@ +* installing *source* package ‘chk’ ... +** this is package ‘chk’ version ‘0.10.0.9012’ +** using staged installation +** R +** inst +** byte-compile and prepare package for lazy loading +** help +*** installing help indices +*** copying figures +** building package indices +** installing vignettes +** testing if installed package can be loaded from temporary location +** testing if installed package can be loaded from final location +** testing if installed package keeps a record of temporary installation path +* DONE (chk) diff --git a/chk.Rcheck/chk-Ex.R b/chk.Rcheck/chk-Ex.R new file mode 100644 index 00000000..877d3fc8 --- /dev/null +++ b/chk.Rcheck/chk-Ex.R @@ -0,0 +1,2094 @@ +pkgname <- "chk" +source(file.path(R.home("share"), "R", "examples-header.R")) +options(warn = 1) +library('chk') + +base::assign(".oldSearch", base::search(), pos = 'CheckExEnv') +base::assign(".old_wd", base::getwd(), pos = 'CheckExEnv') +cleanEx() +nameEx("aaa") +### * aaa + +flush(stderr()); flush(stdout()) + +### Name: aaa +### Title: Workaround: Avoid backtraces in examples +### Aliases: aaa +### Keywords: internal + +### ** Examples + +options(rlang_backtrace_on_error = "none") + + + +cleanEx() +nameEx("abort_chk") +### * abort_chk + +flush(stderr()); flush(stdout()) + +### Name: abort_chk +### Title: Abort Check +### Aliases: abort_chk + +### ** Examples + +try(abort_chk("x must be NULL")) +try(abort_chk("`x` must be NULL")) +try(abort_chk("there %r %n problem value%s", n = 1)) +try(abort_chk("there %r %n problem value%s", n = 1.5)) + + + +cleanEx() +nameEx("cc") +### * cc + +flush(stderr()); flush(stdout()) + +### Name: cc +### Title: Concatenate with Commas +### Aliases: cc + +### ** Examples + +cc(1:2) +cc(1:2, conj = " or") +cc(3:1, brac = "'") +cc(1:11) +cc(as.character(1:2)) + + + +cleanEx() +nameEx("check_data") +### * check_data + +flush(stderr()); flush(stdout()) + +### Name: check_data +### Title: Check Data +### Aliases: check_data + +### ** Examples + +check_data(data.frame()) +check_data(data.frame(x = 2), list(x = 1)) +try(check_data(data.frame(x = 2), list(y = 1L))) +try(check_data(data.frame(x = 2), list(y = 1))) +try(check_data(data.frame(x = 2), nrow = 2)) + + + +cleanEx() +nameEx("check_dim") +### * check_dim + +flush(stderr()); flush(stdout()) + +### Name: check_dim +### Title: Check Dimension +### Aliases: check_dim + +### ** Examples + +check_dim(1) +try(check_dim(1, values = FALSE)) +try(check_dim(1, values = c(10, 2))) +try(check_dim(data.frame(x = 1), dim = nrow, values = c(10, 10, 2))) + + + +cleanEx() +nameEx("check_dirs") +### * check_dirs + +flush(stderr()); flush(stdout()) + +### Name: check_dirs +### Title: Check Directories Exist +### Aliases: check_dirs + +### ** Examples + +check_dirs(tempdir()) +try(check_dirs(tempdir(), exists = FALSE)) + + + +cleanEx() +nameEx("check_files") +### * check_files + +flush(stderr()); flush(stdout()) + +### Name: check_files +### Title: Check Files Exist +### Aliases: check_files + +### ** Examples + +check_files(tempfile("unlikely-that-exists-chk"), exists = FALSE) +try(check_files(tempfile("unlikely-that-exists-chk"))) + + + +cleanEx() +nameEx("check_key") +### * check_key + +flush(stderr()); flush(stdout()) + +### Name: check_key +### Title: Check Key +### Aliases: check_key + +### ** Examples + +x <- data.frame(x = c(1, 2), y = c(1, 1)) +check_key(x) +try(check_key(x, "y")) + + + +cleanEx() +nameEx("check_length") +### * check_length + +flush(stderr()); flush(stdout()) + +### Name: check_length +### Title: Check Length +### Aliases: check_length + +### ** Examples + +check_length(1) +try(check_length(1, values = FALSE)) +try(check_length(1, values = c(10, 2))) + + + +cleanEx() +nameEx("check_names") +### * check_names + +flush(stderr()); flush(stdout()) + +### Name: check_names +### Title: Check Names +### Aliases: check_names + +### ** Examples + +x <- c(x = 1, y = 2) +check_names(x, c("y", "x")) +try(check_names(x, c("y", "x"), order = TRUE)) +try(check_names(x, "x", exclusive = TRUE)) + + + +cleanEx() +nameEx("check_values") +### * check_values + +flush(stderr()); flush(stdout()) + +### Name: check_values +### Title: Check Values and Class +### Aliases: check_values + +### ** Examples + +check_values(1, numeric(0)) +check_values(1, 2) +try(check_values(1, 1L)) +try(check_values(NA_real_, 1)) + + + +cleanEx() +nameEx("chk_all") +### * chk_all + +flush(stderr()); flush(stdout()) + +### Name: chk_all +### Title: Check All +### Aliases: chk_all vld_all + +### ** Examples + +# chk_all +chk_all(TRUE, chk_lgl) +# FIXME try(chk_all(1, chk_lgl)) +chk_all(c(TRUE, NA), chk_lgl) +# vld_all +vld_all(c(TRUE, NA), vld_lgl) + + + +cleanEx() +nameEx("chk_all_equal") +### * chk_all_equal + +flush(stderr()); flush(stdout()) + +### Name: chk_all_equal +### Title: Check All Equal +### Aliases: chk_all_equal vld_all_equal + +### ** Examples + +# chk_all_equal +chk_all_equal(c(1, 1.00000001)) +try(chk_all_equal(c(1, 1.0000001))) +chk_all_equal(list(c(x = 1), c(x = 1))) +try(chk_all_equal(list(c(x = 1), c(y = 1)))) +# vld_all_equal +vld_all_equal(c(1, 1L)) + + + +cleanEx() +nameEx("chk_all_equivalent") +### * chk_all_equivalent + +flush(stderr()); flush(stdout()) + +### Name: chk_all_equivalent +### Title: Check All Equivalent +### Aliases: chk_all_equivalent vld_all_equivalent + +### ** Examples + +# chk_all_equivalent +chk_all_equivalent(c(1, 1.00000001)) +try(chk_all_equivalent(c(1, 1.0000001))) +chk_all_equivalent(list(c(x = 1), c(x = 1))) +chk_all_equivalent(list(c(x = 1), c(y = 1))) +# vld_all_equivalent +vld_all_equivalent(c(x = 1, y = 1)) + + + +cleanEx() +nameEx("chk_all_identical") +### * chk_all_identical + +flush(stderr()); flush(stdout()) + +### Name: chk_all_identical +### Title: Check All Identical +### Aliases: chk_all_identical vld_all_identical + +### ** Examples + +# chk_all_identical +chk_all_identical(c(1, 1)) +try(chk_all_identical(c(1, 1.1))) +# vld_all_identical +vld_all_identical(c(1, 1)) + + + +cleanEx() +nameEx("chk_array") +### * chk_array + +flush(stderr()); flush(stdout()) + +### Name: chk_array +### Title: Check Array +### Aliases: chk_array vld_array + +### ** Examples + +# chk_array +chk_array(array(1)) +try(chk_array(matrix(1))) + +# vld_array +vld_array(1) +vld_array(array(1)) + + + +cleanEx() +nameEx("chk_atomic") +### * chk_atomic + +flush(stderr()); flush(stdout()) + +### Name: chk_atomic +### Title: Check Atomic +### Aliases: chk_atomic vld_atomic + +### ** Examples + +# chk_atomic +chk_atomic(1) +try(chk_atomic(list(1))) +# vld_atomic +vld_atomic(1) +vld_atomic(matrix(1:3)) +vld_atomic(character(0)) +vld_atomic(list(1)) +vld_atomic(NULL) + + + +cleanEx() +nameEx("chk_character") +### * chk_character + +flush(stderr()); flush(stdout()) + +### Name: chk_character +### Title: Check Character +### Aliases: chk_character vld_character + +### ** Examples + +# chk_character +chk_character("1") +try(chk_character(1)) +# vld_character +vld_character("1") +vld_character(matrix("a")) +vld_character(character(0)) +vld_character(NA_character_) +vld_character(1) +vld_character(TRUE) +vld_character(factor("text")) + + + +cleanEx() +nameEx("chk_character_or_factor") +### * chk_character_or_factor + +flush(stderr()); flush(stdout()) + +### Name: chk_character_or_factor +### Title: Check Character or Factor +### Aliases: chk_character_or_factor vld_character_or_factor + +### ** Examples + +# chk_character_or_factor +chk_character_or_factor("1") +chk_character_or_factor(factor("1")) +try(chk_character(1)) +# vld_character_or_factor +vld_character_or_factor("1") +vld_character_or_factor(matrix("a")) +vld_character_or_factor(character(0)) +vld_character_or_factor(NA_character_) +vld_character_or_factor(1) +vld_character_or_factor(TRUE) +vld_character_or_factor(factor("text")) + + + +cleanEx() +nameEx("chk_chr") +### * chk_chr + +flush(stderr()); flush(stdout()) + +### Name: chk_chr +### Title: Check Character Scalar +### Aliases: chk_chr vld_chr + +### ** Examples + +chk_chr("a") +try(chk_chr(1)) +# vld_chr +vld_chr("") +vld_chr("a") +vld_chr(NA_character_) +vld_chr(c("a", "b")) +vld_chr(1) + + + +cleanEx() +nameEx("chk_compatible_lengths") +### * chk_compatible_lengths + +flush(stderr()); flush(stdout()) + +### Name: chk_compatible_lengths +### Title: Check Compatible Lengths +### Aliases: chk_compatible_lengths vld_compatible_lengths + +### ** Examples + +# chk_compatible_lengths + +a <- integer(0) +b <- numeric(0) +chk_compatible_lengths(a, b) + +a <- 1 +b <- 2 +chk_compatible_lengths(a, b) + +a <- 1:3 +b <- 1:3 +chk_compatible_lengths(a, b) + +b <- 1 +chk_compatible_lengths(a, b) + +b <- 1:2 +try(chk_compatible_lengths(a, b)) + +b <- 1:6 +try(chk_compatible_lengths(a, b)) +# vld_compatible_lengths + +a <- integer(0) +b <- numeric(0) +vld_compatible_lengths(a, b) + +a <- 1 +b <- 2 +vld_compatible_lengths(a, b) + +a <- 1:3 +b <- 1:3 +vld_compatible_lengths(a, b) + +b <- 1 +vld_compatible_lengths(a, b) + +b <- 1:2 +vld_compatible_lengths(a, b) + +b <- 1:6 +vld_compatible_lengths(a, b) + + + +cleanEx() +nameEx("chk_complex") +### * chk_complex + +flush(stderr()); flush(stdout()) + +### Name: chk_complex +### Title: Check Complex +### Aliases: chk_complex vld_complex + +### ** Examples + +# chk_complex +chk_complex(1i) +try(chk_complex(1)) +# vld_complex +vld_complex(1i) +vld_complex(complex()) +vld_complex(NA_complex_) +vld_complex(1) +vld_complex(TRUE) + + + +cleanEx() +nameEx("chk_complex_number") +### * chk_complex_number + +flush(stderr()); flush(stdout()) + +### Name: chk_complex_number +### Title: Check Complex Number +### Aliases: chk_complex_number vld_complex_number + +### ** Examples + +# chk_complex_number +chk_complex_number(as.complex(1.1)) +try(chk_complex_number(1.1)) +# vld_complex_number +vld_complex_number(as.complex(2)) + + + +cleanEx() +nameEx("chk_count") +### * chk_count + +flush(stderr()); flush(stdout()) + +### Name: chk_count +### Title: Check Count +### Aliases: chk_count vld_count + +### ** Examples + +# chk_count +chk_count(1) +try(chk_count(1.5)) +# vld_count +vld_count(1) +vld_count(0L) +vld_count(-1) +vld_count(0.5) + + + +cleanEx() +nameEx("chk_data") +### * chk_data + +flush(stderr()); flush(stdout()) + +### Name: chk_data +### Title: Check Data +### Aliases: chk_data vld_data + +### ** Examples + +# chk_data +chk_data(data.frame(x = 1)) +try(chk_data(1)) +# vld_data +vld_data(data.frame()) +vld_data(data.frame(x = 1)) +vld_data(c(x = 1)) + + + +cleanEx() +nameEx("chk_date") +### * chk_date + +flush(stderr()); flush(stdout()) + +### Name: chk_date +### Title: Check Date +### Aliases: chk_date vld_date + +### ** Examples + +# chk_date +chk_date(Sys.Date()) +try(chk_date(1)) +# vld_date +vld_date(Sys.Date()) +vld_date(Sys.time()) +vld_date(1) + + + +cleanEx() +nameEx("chk_date_time") +### * chk_date_time + +flush(stderr()); flush(stdout()) + +### Name: chk_date_time +### Title: Check Date Time +### Aliases: chk_date_time chk_datetime vld_date_time vld_datetime + +### ** Examples + +# chk_date_time +chk_date_time(as.POSIXct("2001-01-02")) +try(chk_date_time(1)) +# vld_date_time +vld_date_time(as.POSIXct("2001-01-02")) +vld_date_time(Sys.time()) +vld_date_time(1) +vld_date_time("2001-01-02") +vld_date_time(c(Sys.time(), Sys.time())) + + + +cleanEx() +nameEx("chk_dbl") +### * chk_dbl + +flush(stderr()); flush(stdout()) + +### Name: chk_dbl +### Title: Check Double Scalar +### Aliases: chk_dbl vld_dbl + +### ** Examples + +# chk_dbl +chk_dbl(1) +try(chk_dbl(1L)) +# vld_dbl +vld_dbl(1) +vld_dbl(double(0)) +vld_dbl(NA_real_) +vld_dbl(c(1, 1)) +vld_dbl(1L) + + + +cleanEx() +nameEx("chk_dir") +### * chk_dir + +flush(stderr()); flush(stdout()) + +### Name: chk_dir +### Title: Check Directory Exists +### Aliases: chk_dir vld_dir + +### ** Examples + +# chk_dir +chk_dir(tempdir()) +try(chk_dir(tempfile())) +# vld_dir +vld_dir(1) +vld_dir(tempdir()) +vld_dir(tempfile()) + + + +cleanEx() +nameEx("chk_double") +### * chk_double + +flush(stderr()); flush(stdout()) + +### Name: chk_double +### Title: Check Double +### Aliases: chk_double vld_double + +### ** Examples + +# chk_double +chk_double(1) +try(chk_double(1L)) +# vld_double +vld_double(1) +vld_double(matrix(c(1, 2, 3, 4), nrow = 2L)) +vld_double(double(0)) +vld_double(numeric(0)) +vld_double(NA_real_) +vld_double(1L) +vld_double(TRUE) + + + +cleanEx() +nameEx("chk_environment") +### * chk_environment + +flush(stderr()); flush(stdout()) + +### Name: chk_environment +### Title: Check Environment +### Aliases: chk_environment vld_environment + +### ** Examples + +# chk_environment +chk_environment(.GlobalEnv) +try(chk_environment(1)) +# vld_environment +vld_environment(1) +vld_environment(list(1)) +vld_environment(.GlobalEnv) +vld_environment(environment()) + + + +cleanEx() +nameEx("chk_equal") +### * chk_equal + +flush(stderr()); flush(stdout()) + +### Name: chk_equal +### Title: Check Equal +### Aliases: chk_equal vld_equal + +### ** Examples + +# chk_equal +chk_equal(1, 1.00000001) +try(chk_equal(1, 1.0000001)) +chk_equal(1, 1L) +chk_equal(c(x = 1), c(x = 1L)) +try(chk_equal(c(x = 1), c(y = 1L))) +vld_equal(1, 1.00000001) + + + +cleanEx() +nameEx("chk_equivalent") +### * chk_equivalent + +flush(stderr()); flush(stdout()) + +### Name: chk_equivalent +### Title: Check Equivalent +### Aliases: chk_equivalent vld_equivalent + +### ** Examples + +# chk_equivalent +chk_equivalent(1, 1.00000001) +try(chk_equivalent(1, 1.0000001)) +chk_equivalent(1, 1L) +chk_equivalent(c(x = 1), c(y = 1)) +vld_equivalent(c(x = 1), c(y = 1L)) + + + +cleanEx() +nameEx("chk_ext") +### * chk_ext + +flush(stderr()); flush(stdout()) + +### Name: chk_ext +### Title: Check File Extension +### Aliases: chk_ext vld_ext + +### ** Examples + +# chk_ext +try(chk_ext("file1.pdf", "png")) +# vld_ext +vld_ext("oeu.pdf", "pdf") +vld_ext(toupper("oeu.pdf"), "PDF") + + + +cleanEx() +nameEx("chk_factor") +### * chk_factor + +flush(stderr()); flush(stdout()) + +### Name: chk_factor +### Title: Check Factor +### Aliases: chk_factor vld_factor + +### ** Examples + +# chk_factor +chk_factor(factor("1")) +try(chk_factor("1")) +# vld_factor +vld_factor(factor("1")) +vld_factor(factor(0)) +vld_factor("1") +vld_factor(1L) + + + +cleanEx() +nameEx("chk_false") +### * chk_false + +flush(stderr()); flush(stdout()) + +### Name: chk_false +### Title: Check FALSE +### Aliases: chk_false vld_false + +### ** Examples + +# chk_false +chk_false(FALSE) +try(chk_false(0)) +# vld_false +vld_false(TRUE) +vld_false(FALSE) +vld_false(NA) +vld_false(0) +vld_false(c(FALSE, FALSE)) + + + +cleanEx() +nameEx("chk_file") +### * chk_file + +flush(stderr()); flush(stdout()) + +### Name: chk_file +### Title: Check File Exists +### Aliases: chk_file vld_file + +### ** Examples + +# chk_file +try(chk_file(tempfile())) +# vld_file +vld_file(tempfile()) + + + +cleanEx() +nameEx("chk_flag") +### * chk_flag + +flush(stderr()); flush(stdout()) + +### Name: chk_flag +### Title: Check Flag +### Aliases: chk_flag vld_flag + +### ** Examples + +# chk_flag +chk_flag(TRUE) +try(vld_flag(1)) +# vld_flag +vld_flag(TRUE) +vld_flag(1) + + + +cleanEx() +nameEx("chk_function") +### * chk_function + +flush(stderr()); flush(stdout()) + +### Name: chk_function +### Title: Check Function +### Aliases: chk_function vld_function + +### ** Examples + +# chk_function +chk_function(mean) +try(chk_function(1)) +# vld_function +vld_function(mean) +vld_function(function(x) x) +vld_function(1) +vld_function(list(1)) + + + +cleanEx() +nameEx("chk_gt") +### * chk_gt + +flush(stderr()); flush(stdout()) + +### Name: chk_gt +### Title: Check Greater Than +### Aliases: chk_gt vld_gt + +### ** Examples + +# chk_gt +chk_gt(0.1) +try(chk_gt(c(0.1, -0.2))) +# vld_gt +vld_gt(numeric(0)) +vld_gt(0) +vld_gt(0.1) +vld_gt(c(0.1, 0.2, NA)) +vld_gt(c(0.1, -0.2)) +vld_gt(c(-0.1, 0.2), value = -1) +vld_gt("b", value = "a") + + + +cleanEx() +nameEx("chk_gte") +### * chk_gte + +flush(stderr()); flush(stdout()) + +### Name: chk_gte +### Title: Check Greater Than or Equal To +### Aliases: chk_gte vld_gte + +### ** Examples + +# chk_gte +chk_gte(0) +try(chk_gte(-0.1)) +# vld_gte +vld_gte(numeric(0)) +vld_gte(0) +vld_gte(-0.1) +vld_gte(c(0.1, 0.2, NA)) +vld_gte(c(0.1, 0.2, NA), value = 1) + + + +cleanEx() +nameEx("chk_identical") +### * chk_identical + +flush(stderr()); flush(stdout()) + +### Name: chk_identical +### Title: Check Identical +### Aliases: chk_identical vld_identical + +### ** Examples + +# chk_identical +chk_identical(1, 1) +try(chk_identical(1, 1L)) +chk_identical(c(1, 1), c(1, 1)) +try(chk_identical(1, c(1, 1))) +vld_identical(1, 1) + + + +cleanEx() +nameEx("chk_integer") +### * chk_integer + +flush(stderr()); flush(stdout()) + +### Name: chk_integer +### Title: Check Integer +### Aliases: chk_integer vld_integer + +### ** Examples + +# chk_integer +chk_integer(1L) +try(chk_integer(1)) +# vld_integer +vld_integer(1L) +vld_integer(matrix(1:4, nrow = 2L)) +vld_integer(integer(0)) +vld_integer(NA_integer_) +vld_integer(1) +vld_integer(TRUE) + + + +cleanEx() +nameEx("chk_is") +### * chk_is + +flush(stderr()); flush(stdout()) + +### Name: chk_is +### Title: Check Class +### Aliases: chk_is vld_is + +### ** Examples + +chk_is(1, "numeric") +try(chk_is(1L, "double")) + +# vld_is +vld_is(numeric(0), "numeric") +vld_is(1L, "double") + + + +cleanEx() +nameEx("chk_join") +### * chk_join + +flush(stderr()); flush(stdout()) + +### Name: chk_join +### Title: Check Join +### Aliases: chk_join vld_join + +### ** Examples + +# chk_join +chk_join(data.frame(z = 1), data.frame(z = 1:2), by = "z") +try(chk_join(data.frame(z = 1), data.frame(z = 2), by = "z")) +# vld_join +vld_join(data.frame(z = 1), data.frame(z = 1:2), by = "z") +vld_join(data.frame(z = 1), data.frame(z = 2), by = "z") +vld_join(data.frame(z = 1), data.frame(a = 1:2), by = c(z = "a")) +vld_join(data.frame(z = 1), data.frame(a = 2), by = c(z = "a")) + + + +cleanEx() +nameEx("chk_length") +### * chk_length + +flush(stderr()); flush(stdout()) + +### Name: chk_length +### Title: Check Length +### Aliases: chk_length vld_length + +### ** Examples + +# chk_length +chk_length("text") +try(vld_length("text", length = 2)) +# vld_length +vld_length(2:1, 2) +vld_length(2:1, 1) + + + +cleanEx() +nameEx("chk_lgl") +### * chk_lgl + +flush(stderr()); flush(stdout()) + +### Name: chk_lgl +### Title: Check Logical Scalar +### Aliases: chk_lgl vld_lgl + +### ** Examples + +# chk_lgl +chk_lgl(NA) +try(chk_lgl(1)) +# vld_lgl +vld_lgl(TRUE) +vld_lgl(FALSE) +vld_lgl(NA) +vld_lgl(1) +vld_lgl(c(TRUE, TRUE)) + + + +cleanEx() +nameEx("chk_list") +### * chk_list + +flush(stderr()); flush(stdout()) + +### Name: chk_list +### Title: Check List +### Aliases: chk_list vld_list + +### ** Examples + +# chk_list +chk_list(list()) +try(chk_list(1)) +# vld_list +vld_list(list()) +vld_list(list(x = 1)) +vld_list(mtcars) +vld_list(1) +vld_list(NULL) + + + +cleanEx() +nameEx("chk_logical") +### * chk_logical + +flush(stderr()); flush(stdout()) + +### Name: chk_logical +### Title: Check Logical +### Aliases: chk_logical vld_logical + +### ** Examples + +# chk_logical +chk_logical(TRUE) +try(chk_logical(1)) +# vld_logical +vld_logical(TRUE) +vld_logical(matrix(TRUE)) +vld_logical(logical(0)) +vld_logical(NA) +vld_logical(1) +vld_logical("TRUE") + + + +cleanEx() +nameEx("chk_lt") +### * chk_lt + +flush(stderr()); flush(stdout()) + +### Name: chk_lt +### Title: Check Less Than +### Aliases: chk_lt vld_lt + +### ** Examples + +# chk_lt +chk_lt(-0.1) +try(chk_lt(c(-0.1, 0.2))) +# vld_lt +vld_lt(numeric(0)) +vld_lt(0) +vld_lt(-0.1) +vld_lt(c(-0.1, -0.2, NA)) +vld_lt(c(-0.1, 0.2)) +vld_lt(c(-0.1, 0.2), value = 1) +vld_lt("a", value = "b") + + + +cleanEx() +nameEx("chk_lte") +### * chk_lte + +flush(stderr()); flush(stdout()) + +### Name: chk_lte +### Title: Check Less Than or Equal To +### Aliases: chk_lte vld_lte + +### ** Examples + +# chk_lte +chk_lte(0) +try(chk_lte(0.1)) +# vld_lte +vld_lte(numeric(0)) +vld_lte(0) +vld_lte(0.1) +vld_lte(c(-0.1, -0.2, NA)) +vld_lte(c(-0.1, -0.2, NA), value = -1) + + + +cleanEx() +nameEx("chk_match") +### * chk_match + +flush(stderr()); flush(stdout()) + +### Name: chk_match +### Title: Check Matches +### Aliases: chk_match vld_match + +### ** Examples + +# chk_match +chk_match("1") +try(chk_match("1", regexp = "2")) +# vld_match +vld_match("1") +vld_match("a", regexp = "a") +vld_match("") +vld_match("1", regexp = "2") +vld_match(NA_character_, regexp = ".*") + + + +cleanEx() +nameEx("chk_matrix") +### * chk_matrix + +flush(stderr()); flush(stdout()) + +### Name: chk_matrix +### Title: Check Matrix +### Aliases: chk_matrix vld_matrix + +### ** Examples + +# chk_matrix +chk_matrix(matrix(1)) +try(chk_matrix(array(1))) +# vld_matrix +vld_matrix(1) +vld_matrix(matrix(1)) + + + +cleanEx() +nameEx("chk_missing") +### * chk_missing + +flush(stderr()); flush(stdout()) + +### Name: chk_missing +### Title: Check Missing Argument +### Aliases: chk_missing vld_missing + +### ** Examples + +# chk_missing +fun <- function(x) { + chk_missing(x) +} +fun() +try(fun(1)) +# vld_missing +fun <- function(x) { + vld_missing(x) +} +fun() +fun(1) + + + +cleanEx() +nameEx("chk_named") +### * chk_named + +flush(stderr()); flush(stdout()) + +### Name: chk_named +### Title: Check Named +### Aliases: chk_named vld_named + +### ** Examples + +# chk_named +chk_named(c(x = 1)) +try(chk_named(list(1))) +# vld_named +vld_named(c(x = 1)) +vld_named(list(x = 1)) +vld_named(c(x = 1)[-1]) +vld_named(list(x = 1)[-1]) +vld_named(1) +vld_named(list(1)) + + + +cleanEx() +nameEx("chk_not_any_na") +### * chk_not_any_na + +flush(stderr()); flush(stdout()) + +### Name: chk_not_any_na +### Title: Check Not Any Missing Values +### Aliases: chk_not_any_na vld_not_any_na + +### ** Examples + +# chk_not_any_na +chk_not_any_na(1) +try(chk_not_any_na(NA)) +# vld_not_any_na +vld_not_any_na(1) +vld_not_any_na(1:2) +vld_not_any_na(NA_real_) +vld_not_any_na(integer(0)) +vld_not_any_na(c(NA, 1)) +vld_not_any_na(TRUE) + + + +cleanEx() +nameEx("chk_not_empty") +### * chk_not_empty + +flush(stderr()); flush(stdout()) + +### Name: chk_not_empty +### Title: Check Not Empty +### Aliases: chk_not_empty vld_not_empty + +### ** Examples + +# chk_not_empty +chk_not_empty(1) +try(chk_not_empty(numeric(0))) +# vld_not_empty +vld_not_empty(1) +vld_not_empty(matrix(1:3)) +vld_not_empty(character(0)) +vld_not_empty(list(1)) +vld_not_empty(NULL) +vld_not_empty(list()) + + + +cleanEx() +nameEx("chk_not_missing") +### * chk_not_missing + +flush(stderr()); flush(stdout()) + +### Name: chk_not_missing +### Title: Check Not Missing Argument +### Aliases: chk_not_missing vld_not_missing + +### ** Examples + +# chk_not_missing +fun <- function(x) { + chk_not_missing(x) +} +fun(1) +try(fun()) +# vld_not_missing +fun <- function(x) { + vld_not_missing(x) +} +fun() +fun(1) + + + +cleanEx() +nameEx("chk_not_null") +### * chk_not_null + +flush(stderr()); flush(stdout()) + +### Name: chk_not_null +### Title: Check not NULL +### Aliases: chk_not_null vld_not_null + +### ** Examples + +# chk_not_null +try(chk_not_null(NULL)) +chk_not_null(1) +# vld_not_null +vld_not_null(1) +vld_not_null(NULL) + + + +cleanEx() +nameEx("chk_not_subset") +### * chk_not_subset + +flush(stderr()); flush(stdout()) + +### Name: chk_not_subset +### Title: Check Not Subset +### Aliases: chk_not_subset + +### ** Examples + +# chk_not_subset +chk_not_subset(11, 1:10) +try(chk_not_subset(1, 1:10)) + + + +cleanEx() +nameEx("chk_null") +### * chk_null + +flush(stderr()); flush(stdout()) + +### Name: chk_null +### Title: Check NULL +### Aliases: chk_null vld_null + +### ** Examples + +# chk_null +try(chk_null(1)) +chk_null(NULL) +# vld_null +vld_null(NULL) +vld_null(1) + + + +cleanEx() +nameEx("chk_null_or") +### * chk_null_or + +flush(stderr()); flush(stdout()) + +### Name: chk_null_or +### Title: Check NULL Or +### Aliases: chk_null_or + +### ** Examples + +chk_null_or(NULL, chk_number) +chk_null_or(1, chk_number) +try(chk_null_or("1", chk_number)) + + + +cleanEx() +nameEx("chk_number") +### * chk_number + +flush(stderr()); flush(stdout()) + +### Name: chk_number +### Title: Check Number +### Aliases: chk_number vld_number + +### ** Examples + +# chk_number +chk_number(1.1) +try(chk_number(TRUE)) +# vld_number +vld_number(1.1) + + + +cleanEx() +nameEx("chk_numeric") +### * chk_numeric + +flush(stderr()); flush(stdout()) + +### Name: chk_numeric +### Title: Check Numeric +### Aliases: chk_numeric vld_numeric + +### ** Examples + +# chk_numeric +chk_numeric(1) +try(chk_numeric("1")) +# vld_numeric +vld_numeric(1) +vld_numeric(1:2) +vld_numeric(NA_real_) +vld_numeric(integer(0)) +vld_numeric("1") +vld_numeric(TRUE) + + + +cleanEx() +nameEx("chk_orderset") +### * chk_orderset + +flush(stderr()); flush(stdout()) + +### Name: chk_orderset +### Title: Check Set Ordered +### Aliases: chk_orderset + +### ** Examples + + +# chk_orderset +chk_orderset(1:2, 1:2) +try(chk_orderset(2:1, 1:2)) + + + +cleanEx() +nameEx("chk_range") +### * chk_range + +flush(stderr()); flush(stdout()) + +### Name: chk_range +### Title: Checks range of non-missing values +### Aliases: chk_range vld_range + +### ** Examples + +# chk_range +chk_range(0) +try(chk_range(-0.1)) +# vld_range +vld_range(numeric(0)) +vld_range(0) +vld_range(-0.1) +vld_range(c(0.1, 0.2, NA)) +vld_range(c(0.1, 0.2, NA), range = c(0, 1)) + + + +cleanEx() +nameEx("chk_raw") +### * chk_raw + +flush(stderr()); flush(stdout()) + +### Name: chk_raw +### Title: Check Raw +### Aliases: chk_raw vld_raw + +### ** Examples + +# chk_raw +chk_raw(as.raw(1)) +try(chk_raw(1)) +# vld_raw +vld_raw(as.raw(1)) +vld_raw(raw(0)) +vld_raw(1) +vld_raw(TRUE) + + + +cleanEx() +nameEx("chk_s3_class") +### * chk_s3_class + +flush(stderr()); flush(stdout()) + +### Name: chk_s3_class +### Title: Check Type +### Aliases: chk_s3_class vld_s3_class + +### ** Examples + +# chk_s3_class +chk_s3_class(1, "numeric") +try(chk_s3_class(getClass("MethodDefinition"), "classRepresentation")) +# vld_s3_class +vld_s3_class(numeric(0), "numeric") +vld_s3_class(getClass("MethodDefinition"), "classRepresentation") + + + +cleanEx() +nameEx("chk_s4_class") +### * chk_s4_class + +flush(stderr()); flush(stdout()) + +### Name: chk_s4_class +### Title: Check Inherits from S4 Class +### Aliases: chk_s4_class vld_s4_class + +### ** Examples + +# chk_s4_class +try(chk_s4_class(1, "numeric")) +chk_s4_class(getClass("MethodDefinition"), "classRepresentation") +# vld_s4_class +vld_s4_class(numeric(0), "numeric") +vld_s4_class(getClass("MethodDefinition"), "classRepresentation") + + + +cleanEx() +nameEx("chk_scalar") +### * chk_scalar + +flush(stderr()); flush(stdout()) + +### Name: chk_scalar +### Title: Check Scalar +### Aliases: chk_scalar vld_scalar + +### ** Examples + +# chk_scalar +chk_scalar(1) +chk_scalar(list(1)) +try(chk_scalar(1:2)) +# vld_scalar +vld_scalar(1) + + + +cleanEx() +nameEx("chk_setequal") +### * chk_setequal + +flush(stderr()); flush(stdout()) + +### Name: vld_orderset +### Title: Check Set Equal +### Aliases: vld_orderset chk_setequal vld_setequal + +### ** Examples + + +# vld_orderset +vld_orderset(1, 1) +vld_orderset(1:2, 2:1) +vld_orderset(1, 2:1) +vld_orderset(1:2, 2) +# chk_setequal +chk_setequal(1:2, 2:1) +try(chk_setequal(1, 1:2)) +# vld_setequal +vld_setequal(1, 1) +vld_setequal(1:2, 2:1) +vld_setequal(1, 2:1) +vld_setequal(1:2, 2) + + + +cleanEx() +nameEx("chk_sorted") +### * chk_sorted + +flush(stderr()); flush(stdout()) + +### Name: chk_sorted +### Title: Check Sorted +### Aliases: chk_sorted vld_sorted + +### ** Examples + +# chk_sorted +chk_sorted(1:2) +try(chk_sorted(2:1)) +# vld_sorted +vld_sorted(1:2) +vld_sorted(2:1) + + + +cleanEx() +nameEx("chk_string") +### * chk_string + +flush(stderr()); flush(stdout()) + +### Name: chk_string +### Title: Check String +### Aliases: chk_string vld_string + +### ** Examples + +# chk_string +chk_string("1") +try(chk_string(1)) +# vld_string +vld_string("1") +vld_string("") +vld_string(1) +vld_string(NA_character_) +vld_string(c("1", "1")) + + + +cleanEx() +nameEx("chk_subset") +### * chk_subset + +flush(stderr()); flush(stdout()) + +### Name: vld_not_subset +### Title: Check Subset +### Aliases: vld_not_subset chk_subset vld_subset + +### ** Examples + +# vld_not_subset +vld_not_subset(numeric(0), 1:10) +vld_not_subset(1, 1:10) +vld_not_subset(11, 1:10) +# chk_subset +chk_subset(1, 1:10) +try(chk_subset(11, 1:10)) +# vld_subset +vld_subset(numeric(0), 1:10) +vld_subset(1, 1:10) +vld_subset(11, 1:10) + + + +cleanEx() +nameEx("chk_superset") +### * chk_superset + +flush(stderr()); flush(stdout()) + +### Name: chk_superset +### Title: Check Superset +### Aliases: chk_superset vld_superset + +### ** Examples + +# chk_superset +chk_superset(1:3, 1) +try(chk_superset(1:3, 4)) +# vld_superset +vld_superset(1:3, 1) +vld_superset(1:3, 4) +vld_superset(integer(0), integer(0)) + + + +cleanEx() +nameEx("chk_true") +### * chk_true + +flush(stderr()); flush(stdout()) + +### Name: chk_true +### Title: Check TRUE +### Aliases: chk_true vld_true + +### ** Examples + +# chk_true +chk_true(TRUE) +try(chk_true(1)) +# vld_true +vld_true(TRUE) +vld_true(FALSE) +vld_true(NA) +vld_true(0) +vld_true(c(TRUE, TRUE)) + + + +cleanEx() +nameEx("chk_tz") +### * chk_tz + +flush(stderr()); flush(stdout()) + +### Name: chk_tz +### Title: Check Time Zone +### Aliases: chk_tz vld_tz + +### ** Examples + +chk_tz("UTC") +try(chk_tz("TCU")) +vld_tz("UTC") +vld_tz("TCU") + + + +cleanEx() +nameEx("chk_unique") +### * chk_unique + +flush(stderr()); flush(stdout()) + +### Name: chk_unique +### Title: Check Unique +### Aliases: chk_unique vld_unique + +### ** Examples + +# chk_unique +chk_unique(c(NA, 2)) +try(chk_unique(c(NA, NA, 2))) +chk_unique(c(NA, NA, 2), incomparables = NA) +# vld_unique +vld_unique(NULL) +vld_unique(numeric(0)) +vld_unique(c(NA, 2)) +vld_unique(c(NA, NA, 2)) +vld_unique(c(NA, NA, 2), incomparables = NA) + + + +cleanEx() +nameEx("chk_unused") +### * chk_unused + +flush(stderr()); flush(stdout()) + +### Name: chk_unused +### Title: Check ... Unused +### Aliases: chk_unused vld_unused + +### ** Examples + +# chk_unused +fun <- function(x, ...) { + chk_unused(...) + x +} +fun(1) +try(fun(1, 2)) +# vld_unused +fun <- function(x, ...) { + vld_unused(...) +} +fun(1) +try(fun(1, 2)) + + + +cleanEx() +nameEx("chk_used") +### * chk_used + +flush(stderr()); flush(stdout()) + +### Name: chk_used +### Title: Check ... Used +### Aliases: chk_used vld_used + +### ** Examples + +# chk_used +fun <- function(x, ...) { + chk_used(...) + x +} +try(fun(1)) +fun(1, 2) +# vld_used +fun <- function(x, ...) { + vld_used(...) +} +fun(1) +fun(1, 2) + + + +cleanEx() +nameEx("chk_valid_name") +### * chk_valid_name + +flush(stderr()); flush(stdout()) + +### Name: chk_valid_name +### Title: Check Valid Name +### Aliases: chk_valid_name vld_valid_name + +### ** Examples + +# chk_valid_name +chk_valid_name("text") +try(chk_valid_name(".1")) +# vld_valid_name +vld_valid_name(".1") + + + +cleanEx() +nameEx("chk_vector") +### * chk_vector + +flush(stderr()); flush(stdout()) + +### Name: chk_vector +### Title: Check Vector +### Aliases: chk_vector vld_vector + +### ** Examples + +# chk_vector +chk_vector(1) +chk_vector(list()) +try(chk_vector(matrix(1))) +# vld_vector +vld_vector(1) + + + +cleanEx() +nameEx("chk_whole_number") +### * chk_whole_number + +flush(stderr()); flush(stdout()) + +### Name: chk_whole_number +### Title: Check Whole Number +### Aliases: chk_whole_number vld_whole_number + +### ** Examples + +# chk_whole_number +chk_whole_number(2) +try(chk_whole_number(1.1)) +# vld_whole_number +vld_whole_number(2) + + + +cleanEx() +nameEx("chk_whole_numeric") +### * chk_whole_numeric + +flush(stderr()); flush(stdout()) + +### Name: chk_whole_numeric +### Title: Check Whole Numeric +### Aliases: chk_whole_numeric vld_whole_numeric + +### ** Examples + +# chk_whole_numeric +chk_whole_numeric(1) +try(chk_whole_numeric(1.1)) +# vld_whole_numeric +vld_whole_numeric(1) +vld_whole_numeric(NA_real_) +vld_whole_numeric(1:2) +vld_whole_numeric(double(0)) +vld_whole_numeric(TRUE) +vld_whole_numeric(1.5) + + + +cleanEx() +nameEx("chk_wnum") +### * chk_wnum + +flush(stderr()); flush(stdout()) + +### Name: chk_wnum +### Title: Check Whole Numeric Scalar +### Aliases: chk_wnum vld_wnum + +### ** Examples + +# chk_wnum +chk_wnum(1) +try(chk_wnum(1.1)) +# vld_wnum +vld_wnum(1) +vld_wnum(double(0)) +vld_wnum(NA_real_) +vld_wnum(c(1, 1)) +vld_wnum(1L) + + + +cleanEx() +nameEx("chkor") +### * chkor + +flush(stderr()); flush(stdout()) + +### Name: chkor +### Title: Check OR +### Aliases: chkor + +### ** Examples + +chkor() +chkor(chk_flag(TRUE)) +try(chkor(chk_flag(1))) +try(chkor(chk_flag(1), chk_flag(2))) +chkor(chk_flag(1), chk_flag(TRUE)) + + + +cleanEx() +nameEx("chkor_vld") +### * chkor_vld + +flush(stderr()); flush(stdout()) + +### Name: chkor_vld +### Title: Chk OR +### Aliases: chkor_vld + +### ** Examples + +chkor_vld() +chkor_vld(vld_flag(TRUE)) +try(chkor_vld(vld_flag(1))) +try(chkor_vld(vld_flag(1), vld_flag(2))) +chkor_vld(vld_flag(1), vld_flag(TRUE)) + + + +cleanEx() +nameEx("deparse_backtick_chk") +### * deparse_backtick_chk + +flush(stderr()); flush(stdout()) + +### Name: deparse_backtick_chk +### Title: Deparse Backtick +### Aliases: deparse_backtick_chk backtick_chk unbacktick_chk + +### ** Examples + + +# deparse_backtick_chk +deparse_backtick_chk(2) +deparse_backtick_chk(2^2) + + + +cleanEx() +nameEx("err") +### * err + +flush(stderr()); flush(stdout()) + +### Name: err +### Title: Stop, Warning and Message Messages +### Aliases: err wrn msg + +### ** Examples + + +# err +try(err("there %r %n problem value%s", n = 2)) + +# wrn +wrn("there %r %n problem value%s", n = 2) + +# msg +msg("there %r %n problem value%s", n = 2) + + + +cleanEx() +nameEx("expect_chk_error") +### * expect_chk_error + +flush(stderr()); flush(stdout()) + +### Name: expect_chk_error +### Title: Expect Chk Error +### Aliases: expect_chk_error + +### ** Examples + +expect_chk_error(chk_true(FALSE)) +try(expect_chk_error(chk_false(FALSE))) + + + +cleanEx() +nameEx("message_chk") +### * message_chk + +flush(stderr()); flush(stdout()) + +### Name: message_chk +### Title: Construct Tidyverse Style Message +### Aliases: message_chk + +### ** Examples + +message_chk("there %r %n", " problem director%y%s") +message_chk("there %r %n", " problem director%y%s", n = 1) +message_chk("There %r %n", " problem director%y%s.", n = 3) + + + +cleanEx() +nameEx("p") +### * p + +flush(stderr()); flush(stdout()) + +### Name: p +### Title: Concatenate Strings +### Aliases: p p0 + +### ** Examples + +p("a", "b") +p(c("a", "b"), collapse = " ") +p0("a", "b") +p0(c("a", "b"), collapse = "") + + + +### *