मैंने इस स्विचिंग व्यवहार को उत्पन्न करने के लिए सिर्फ एक अच्छी डेटा संरचना और प्रसंस्करण की श्रृंखला को एक साथ रखा है, किसी भी पुस्तकालयों की आवश्यकता नहीं है। मुझे यकीन है कि इसे कई बार लागू किया गया होगा, और इस थ्रेड में उदाहरणों की तलाश में आया था - मुझे लगा कि मैं चिप लगाऊंगा।
मुझे विशेष रूप से झंडे की आवश्यकता नहीं थी (केवल ध्वज यहां एक डीबग मोड है, एक चर बना रहा है जिसे मैं एक डाउनस्ट्रीम फ़ंक्शन शुरू करने की स्थिति के रूप में जांचता हूं if (!exists(debug.mode)) {...} else {print(variables)})
। lapply
नीचे दिए गए फ्लैग की जांच करने वाले बयान निम्नानुसार हैं:
if ("--debug" %in% args) debug.mode <- T
if ("-h" %in% args || "--help" %in% args)
args
कमांड लाइन आर्ग्युमेंट्स में वेरिएबल कहां से पढ़ा जाता है (एक कैरेक्टर वेक्टर, c('--debug','--help')
जब आप इन्हें उदाहरण के लिए सप्लाई करते हैं तो बराबर )
यह किसी भी अन्य ध्वज के लिए पुन: प्रयोज्य है और आप सभी पुनरावृत्ति से बचते हैं, और कोई पुस्तकालय नहीं तो कोई निर्भरता नहीं:
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))
ध्यान दें कि flag.details
यहां कमांड को स्ट्रिंग्स के रूप में संग्रहीत किया जाता है, फिर उसके साथ मूल्यांकन किया जाता है eval(parse(text = '...'))
। ऑप्टपर्स स्पष्ट रूप से किसी भी गंभीर स्क्रिप्ट के लिए वांछनीय है, लेकिन न्यूनतम-कार्यक्षमता कोड भी कभी-कभी अच्छा होता है।
नमूना उत्पादन:
$ Rscript check_mail.Rscript --help
-debug फ़ंक्शन XYZ निष्पादित करने के बजाय प्रिंट वैरिएबल ...
-h --help प्रदर्शन ध्वज परिभाषाएँ