|
2 | 2 | # http://adv-r.had.co.nz/Computing-on-the-language.html#substitute
|
3 | 3 | # Modeled after / copied from rundel/ghclass
|
4 | 4 |
|
5 |
| -handle_arg_list <- function(..., tests) { |
| 5 | +handle_arg_list <- function(..., .tests) { |
6 | 6 | values <- list(...)
|
7 | 7 | names <- eval(substitute(alist(...)))
|
8 | 8 | names <- map(names, deparse)
|
9 | 9 |
|
10 |
| - walk2(names, values, tests) |
| 10 | + walk2(names, values, .tests) |
11 | 11 | }
|
12 | 12 |
|
13 | 13 | arg_is_scalar <- function(..., allow_null = FALSE, allow_na = FALSE) {
|
14 |
| - handle_arg_list( |
15 |
| - ..., |
16 |
| - tests = function(name, value) { |
17 |
| - if (length(value) > 1 | (!allow_null & length(value) == 0)) { |
18 |
| - cli::cli_abort("Argument {.val {name}} must be of length 1.") |
19 |
| - } |
20 |
| - if (!is.null(value)) { |
21 |
| - if (is.na(value) & !allow_na) { |
22 |
| - cli::cli_abort( |
23 |
| - "Argument {.val {name}} must not be a missing value ({.val {NA}})." |
24 |
| - ) |
25 |
| - } |
26 |
| - } |
27 |
| - } |
28 |
| - ) |
| 14 | + handle_arg_list(..., .tests = function(name, value) { |
| 15 | + assert_scalar(value, null.ok = allow_null, na.ok = allow_na, .var.name = name) |
| 16 | + }) |
29 | 17 | }
|
30 | 18 |
|
31 |
| - |
32 | 19 | arg_is_lgl <- function(..., allow_null = FALSE, allow_na = FALSE, allow_empty = FALSE) {
|
33 |
| - handle_arg_list( |
34 |
| - ..., |
35 |
| - tests = function(name, value) { |
36 |
| - if (is.null(value) & !allow_null) { |
37 |
| - cli::cli_abort("Argument {.val {name}} must be of logical type.") |
38 |
| - } |
39 |
| - if (any(is.na(value)) & !allow_na) { |
40 |
| - cli::cli_abort("Argument {.val {name}} must not contain any missing values ({.val {NA}}).") |
41 |
| - } |
42 |
| - if (!is.null(value) & (length(value) == 0 & !allow_empty)) { |
43 |
| - cli::cli_abort("Argument {.val {name}} must have length >= 1.") |
44 |
| - } |
45 |
| - if (!is.null(value) & length(value) != 0 & !is.logical(value)) { |
46 |
| - cli::cli_abort("Argument {.val {name}} must be of logical type.") |
47 |
| - } |
48 |
| - } |
49 |
| - ) |
| 20 | + handle_arg_list(..., .tests = function(name, value) { |
| 21 | + assert_logical(value, null.ok = allow_null, any.missing = allow_na, min.len = as.integer(!allow_empty), .var.name = name) |
| 22 | + }) |
50 | 23 | }
|
51 | 24 |
|
52 | 25 | arg_is_lgl_scalar <- function(..., allow_null = FALSE, allow_na = FALSE) {
|
53 |
| - arg_is_lgl(..., allow_null = allow_null, allow_na = allow_na) |
54 |
| - arg_is_scalar(..., allow_null = allow_null, allow_na = allow_na) |
| 26 | + handle_arg_list(..., .tests = function(name, value) { |
| 27 | + assert_logical(value, null.ok = allow_null, any.missing = allow_na, min.len = 1, max.len = 1, .var.name = name) |
| 28 | + }) |
55 | 29 | }
|
56 | 30 |
|
57 | 31 | arg_is_numeric <- function(..., allow_null = FALSE) {
|
58 |
| - handle_arg_list( |
59 |
| - ..., |
60 |
| - tests = function(name, value) { |
61 |
| - if (!(is.numeric(value) | (is.null(value) & allow_null))) { |
62 |
| - cli::cli_abort("All {.val {name}} must numeric.") |
63 |
| - } |
64 |
| - } |
65 |
| - ) |
| 32 | + handle_arg_list(..., .tests = function(name, value) { |
| 33 | + assert_numeric(value, null.ok = allow_null, any.missing = FALSE, .var.name = name) |
| 34 | + }) |
66 | 35 | }
|
67 | 36 |
|
68 | 37 | arg_is_pos <- function(..., allow_null = FALSE) {
|
69 |
| - arg_is_numeric(..., allow_null = allow_null) |
70 |
| - handle_arg_list( |
71 |
| - ..., |
72 |
| - tests = function(name, value) { |
73 |
| - if (!(all(value > 0) | (is.null(value) & allow_null))) { |
74 |
| - cli::cli_abort("All {.val {name}} must be positive number(s).") |
75 |
| - } |
76 |
| - } |
77 |
| - ) |
| 38 | + handle_arg_list(..., .tests = function(name, value) { |
| 39 | + assert_numeric(value, lower = 1, null.ok = allow_null, any.missing = FALSE, .var.name = name) |
| 40 | + }) |
78 | 41 | }
|
79 | 42 |
|
80 | 43 | arg_is_nonneg <- function(..., allow_null = FALSE) {
|
81 |
| - arg_is_numeric(..., allow_null = allow_null) |
82 |
| - handle_arg_list( |
83 |
| - ..., |
84 |
| - tests = function(name, value) { |
85 |
| - if (!(all(value >= 0) | (is.null(value) & allow_null))) { |
86 |
| - cli::cli_abort("All {.val {name}} must be nonnegative number(s).") |
87 |
| - } |
88 |
| - } |
89 |
| - ) |
| 44 | + handle_arg_list(..., .tests = function(name, value) { |
| 45 | + assert_numeric(value, lower = 0, null.ok = allow_null, any.missing = FALSE, .var.name = name) |
| 46 | + }) |
90 | 47 | }
|
91 | 48 |
|
92 | 49 | arg_is_int <- function(..., allow_null = FALSE) {
|
93 |
| - arg_is_numeric(..., allow_null = allow_null) |
94 |
| - handle_arg_list( |
95 |
| - ..., |
96 |
| - tests = function(name, value) { |
97 |
| - if (!(all(value %% 1 == 0) | (is.null(value) & allow_null))) { |
98 |
| - cli::cli_abort("All {.val {name}} must be whole positive number(s).") |
99 |
| - } |
100 |
| - } |
101 |
| - ) |
| 50 | + handle_arg_list(..., .tests = function(name, value) { |
| 51 | + assert_integerish(value, null.ok = allow_null, .var.name = name) |
| 52 | + }) |
102 | 53 | }
|
103 | 54 |
|
104 | 55 | arg_is_pos_int <- function(..., allow_null = FALSE) {
|
105 |
| - arg_is_int(..., allow_null = allow_null) |
106 |
| - arg_is_pos(..., allow_null = allow_null) |
| 56 | + handle_arg_list(..., .tests = function(name, value) { |
| 57 | + assert_integerish(value, null.ok = allow_null, lower = 1, any.missing = FALSE, .var.name = name) |
| 58 | + }) |
107 | 59 | }
|
108 | 60 |
|
109 |
| - |
110 | 61 | arg_is_nonneg_int <- function(..., allow_null = FALSE) {
|
111 |
| - arg_is_int(..., allow_null = allow_null) |
112 |
| - arg_is_nonneg(..., allow_null = allow_null) |
113 |
| -} |
114 |
| - |
115 |
| -arg_is_date <- function(..., allow_null = FALSE, allow_na = FALSE) { |
116 |
| - handle_arg_list( |
117 |
| - ..., |
118 |
| - tests = function(name, value) { |
119 |
| - if (is.null(value) & !allow_null) { |
120 |
| - cli::cli_abort("Argument {.val {name}} may not be `NULL`.") |
121 |
| - } |
122 |
| - if (any(is.na(value)) & !allow_na) { |
123 |
| - cli::cli_abort("Argument {.val {name}} must not contain any missing values ({.val {NA}}).") |
124 |
| - } |
125 |
| - if (!(is(value, "Date") | is.null(value) | all(is.na(value)))) { |
126 |
| - cli::cli_abort("Argument {.val {name}} must be a Date. Try `as.Date()`.") |
127 |
| - } |
128 |
| - } |
129 |
| - ) |
130 |
| -} |
131 |
| - |
132 |
| -arg_is_probabilities <- function(..., allow_null = FALSE) { |
133 |
| - arg_is_numeric(..., allow_null = allow_null) |
134 |
| - handle_arg_list( |
135 |
| - ..., |
136 |
| - tests = function(name, value) { |
137 |
| - if (!((all(value >= 0) && all(value <= 1)) | (is.null(value) & allow_null))) { |
138 |
| - cli::cli_abort("All {.val {name}} must be in [0,1].") |
139 |
| - } |
140 |
| - } |
141 |
| - ) |
| 62 | + handle_arg_list(..., .tests = function(name, value) { |
| 63 | + assert_integerish(value, null.ok = allow_null, lower = 0, any.missing = FALSE, .var.name = name) |
| 64 | + }) |
142 | 65 | }
|
143 | 66 |
|
144 |
| -arg_is_chr <- function(..., allow_null = FALSE, allow_na = FALSE, allow_empty = FALSE) { |
145 |
| - handle_arg_list( |
146 |
| - ..., |
147 |
| - tests = function(name, value) { |
148 |
| - if (is.null(value) & !allow_null) { |
149 |
| - cli::cli_abort("Argument {.val {name}} may not be `NULL`.") |
150 |
| - } |
151 |
| - if (any(is.na(value)) & !allow_na) { |
152 |
| - cli::cli_abort("Argument {.val {name}} must not contain any missing values ({.val {NA}}).") |
153 |
| - } |
154 |
| - if (!is.null(value) & (length(value) == 0L & !allow_empty)) { |
155 |
| - cli::cli_abort("Argument {.val {name}} must have length > 0.") |
156 |
| - } |
157 |
| - if (!(is.character(value) | is.null(value) | all(is.na(value)))) { |
158 |
| - cli::cli_abort("Argument {.val {name}} must be of character type.") |
159 |
| - } |
160 |
| - } |
161 |
| - ) |
| 67 | +arg_is_date <- function(..., allow_null = FALSE) { |
| 68 | + handle_arg_list(..., .tests = function(name, value) { |
| 69 | + assert_date(value, null.ok = allow_null, .var.name = name) |
| 70 | + }) |
162 | 71 | }
|
163 | 72 |
|
164 |
| -arg_is_chr_scalar <- function(..., allow_null = FALSE, allow_na = FALSE) { |
165 |
| - arg_is_chr(..., allow_null = allow_null, allow_na = allow_na) |
166 |
| - arg_is_scalar(..., allow_null = allow_null, allow_na = allow_na) |
| 73 | +arg_is_probabilities <- function(..., allow_null = FALSE, allow_na = FALSE) { |
| 74 | + handle_arg_list(..., .tests = function(name, value) { |
| 75 | + assert_numeric(value, lower = 0, upper = 1, null.ok = allow_null, any.missing = allow_na, .var.name = name) |
| 76 | + }) |
167 | 77 | }
|
168 | 78 |
|
169 |
| - |
170 |
| -arg_is_function <- function(..., allow_null = FALSE) { |
171 |
| - handle_arg_list( |
172 |
| - ..., |
173 |
| - tests = function(name, value) { |
174 |
| - if (is.null(value) & !allow_null) { |
175 |
| - cli::cli_abort("Argument {.val {name}} must be a function.") |
176 |
| - } |
177 |
| - if (!is.null(value) & !is.function(value)) { |
178 |
| - cli::cli_abort("Argument {.val {name}} must be a function.") |
179 |
| - } |
180 |
| - } |
181 |
| - ) |
| 79 | +arg_is_chr <- function(..., allow_null = FALSE, allow_na = FALSE, allow_empty = FALSE) { |
| 80 | + handle_arg_list(..., .tests = function(name, value) { |
| 81 | + assert_character(value, null.ok = allow_null, any.missing = allow_na, min.len = as.integer(!allow_empty), .var.name = name) |
| 82 | + }) |
182 | 83 | }
|
183 | 84 |
|
184 |
| - |
185 |
| - |
186 |
| -arg_is_sorted <- function(..., allow_null = FALSE) { |
187 |
| - handle_arg_list( |
188 |
| - ..., |
189 |
| - tests = function(name, value) { |
190 |
| - if (is.unsorted(value, na.rm = TRUE) | (is.null(value) & !allow_null)) { |
191 |
| - cli::cli_abort("{.val {name}} must be sorted in increasing order.") |
192 |
| - } |
193 |
| - } |
194 |
| - ) |
| 85 | +arg_is_chr_scalar <- function(..., allow_null = FALSE, allow_na = FALSE) { |
| 86 | + handle_arg_list(..., .tests = function(name, value) { |
| 87 | + assert_character(value, null.ok = allow_null, any.missing = allow_na, min.len = 1, max.len = 1, .var.name = name) |
| 88 | + }) |
195 | 89 | }
|
196 | 90 |
|
| 91 | +arg_is_function <- function(..., allow_null = FALSE) { |
| 92 | + handle_arg_list(..., .tests = function(name, value) { |
| 93 | + assert_function(value, null.ok = allow_null, .var.name = name) |
| 94 | + }) |
| 95 | +} |
197 | 96 |
|
198 |
| -arg_to_date <- function(x, allow_null = FALSE, allow_na = FALSE) { |
199 |
| - arg_is_scalar(x, allow_null = allow_null, allow_na = allow_na) |
| 97 | +arg_to_date <- function(x, allow_null = FALSE) { |
| 98 | + arg_is_scalar(x, allow_null = allow_null) |
200 | 99 | if (!is.null(x)) {
|
201 | 100 | x <- tryCatch(as.Date(x, origin = "1970-01-01"), error = function(e) NA)
|
202 | 101 | }
|
203 |
| - arg_is_date(x, allow_null = allow_null, allow_na = allow_na) |
| 102 | + arg_is_date(x, allow_null = allow_null) |
204 | 103 | x
|
205 | 104 | }
|
0 commit comments