annotate Intchecks/parseargs.R @ 6:ec75de7f1e08 draft default tip

Uploaded
author melpetera
date Mon, 11 Dec 2023 12:56:20 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
1 # parseCommandArgs function
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
2 parse_args <- function(
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
3 args = NULL,
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
4 convert_booleans = TRUE,
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
5 convert_numerics = TRUE
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
6 ) {
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
7 if (is.null(args)) {
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
8 args <- commandArgs()
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
9 }
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
10 start <- which(args == "--args")[1] + 1
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
11 if (is.na(start)) {
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
12 return(list())
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
13 }
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
14 seq_by2 <- seq(start, length(args), by = 2)
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
15 result <- as.list(args[seq_by2 + 1])
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
16 names(result) <- args[seq_by2]
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
17 converters <- c()
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
18 if (convert_booleans) {
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
19 converters <- c(
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
20 converters,
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
21 function(x) {
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
22 return(if (x == "TRUE") TRUE else if (x == "FALSE") FALSE else x)
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
23 }
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
24 )
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
25 }
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
26 if (convert_numerics) {
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
27 converters <- c(
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
28 converters,
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
29 function(x) {
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
30 return(if (is.na(y <- as.numeric(x))) x else y)
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
31 }
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
32 )
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
33 }
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
34 return(convert_parameters(result, converters))
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
35 }
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
36
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
37 convert_parameters <- function(args, converters) {
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
38 suppressWarnings(
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
39 for (param in names(args)) {
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
40 for (converter in converters) {
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
41 old_value <- args[[param]]
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
42 args[[param]] <- converter(args[[param]])
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
43 if (!identical(args[[param]], old_value)) {
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
44 ## The value has been modified by the converter, and
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
45 ## we don't want values to be converted multiple times,
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
46 ## so we pass to the next value.
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
47 break
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
48 }
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
49 }
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
50 }
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
51 )
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
52 return(args)
ec75de7f1e08 Uploaded
melpetera
parents:
diff changeset
53 }