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