ich gerade zusammen eine schöne Datenstruktur und die Kette der Verarbeitung dieses Schaltverhalten zu erzeugen, benötigt keine Bibliotheken. Ich bin mir sicher, dass es viele Male umgesetzt worden sein wird, und stieß auf diesen Thread auf der Suche nach Beispielen - dachte, ich würde einspringen.
Ich brauchte nicht einmal besonders Flags (das einzige Flag hier ist ein Debug-Modus, Erstellen einer Variablen, die ich als Bedingung für den Start einer Downstream-Funktion if (!exists(debug.mode)) {...} else {print(variables)})
überprüfen. Die Flag Überprüfung lapply
Aussagen unten produzieren das gleiche wie:
if ("--debug" %in% args) debug.mode <- T
if ("-h" %in% args || "--help" %in% args)
wo args
ist die Variable in von Befehlszeilenargumenten lesen
Es ist wieder verwendbar für andere flag (eine Zeichenvektor entspricht c('--debug','--help')
wenn man diese auf etwa liefern), und Sie vermeiden alle Wiederholungs , und keine Bibliotheken, so dass keine Abhängigkeiten:
args <- commandArgs(TRUE)
flag.details <- list(
"debug" = list(
def = "Print variables rather than executing function XYZ...",
flag = "--debug",
output = "debug.mode <- T"),
"help" = list(
def = "Display flag definitions",
flag = c("-h","--help"),
output = "cat(help.prompt)"))
flag.conditions <- lapply(flag.details, function(x) {
paste0(paste0('"',x$flag,'"'), sep = " %in% args", collapse = " || ")
})
flag.truth.table <- unlist(lapply(flag.conditions, function(x) {
if (eval(parse(text = x))) {
return(T)
} else return(F)
}))
help.prompts <- lapply(names(flag.truth.table), function(x){
# joins 2-space-separatated flags with a tab-space to the flag description
paste0(c(paste0(flag.details[x][[1]][['flag']], collapse=" "),
flag.details[x][[1]][['def']]), collapse="\t")
})
help.prompt <- paste(c(unlist(help.prompts),''),collapse="\n\n")
# The following lines handle the flags, running the corresponding 'output' entry in flag.details for any supplied
flag.output <- unlist(lapply(names(flag.truth.table), function(x){
if (flag.truth.table[x]) return(flag.details[x][[1]][['output']])
}))
eval(parse(text = flag.output))
Beachten Sie, dass in flag.details
hier die Befehle als Strings gespeichert, dann mit eval(parse(text = '...'))
ausgewertet. OptParse ist offensichtlich für jedes seriöse Skript wünschenswert, aber auch Code mit minimaler Funktionalität ist manchmal gut.
Beispielausgabe:
$ Rscript check_mail.Rscript --help
--debug Print variables rather than executing function XYZ...
-h --help Display flag definitions
müssen Sie den Speicherort von rscript ausführbar –