এই স্যুইচিং আচরণটি উত্পন্ন করতে আমি কেবল একটি দুর্দান্ত ডেটা কাঠামো এবং প্রসেসিংয়ের চেইন একসাথে রেখেছি, কোনও লাইব্রেরির প্রয়োজন নেই। আমি নিশ্চিত যে এটি বহুবার প্রয়োগ করা হবে এবং উদাহরণটি সন্ধান করতে এই থ্রেডটি জুড়ে এসেছিল - ভেবেছিলাম আমি চিপ করব।
আমার এমনকি বিশেষত পতাকাগুলির প্রয়োজন হয়নি (এখানে কেবলমাত্র পতাকাটি একটি ডিবাগ মোড, এটি একটি ভেরিয়েবল তৈরি করে যা আমি ডাউন স্ট্রিম ফাংশন শুরু করার শর্ত হিসাবে if (!exists(debug.mode)) {...} else {print(variables)})
যাচাই করি lapply
below নীচের পতাকা চেকিং স্টেটমেন্টগুলি একইভাবে উত্পন্ন করে:
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 = '...'))
। Optparse কোনও গুরুতর স্ক্রিপ্টের জন্য স্পষ্টতই কাম্য, তবে ন্যূনতম-কার্যকারিতা কোড কখনও কখনও খুব ভাল।
নমুনা আউটপুট:
$ রেক্রিপ্ট চেক_মেল.আরস্ক্রিপ্ট - সহায়তা
--debug XYZ ফাংশন সম্পাদন করার পরিবর্তে প্রিন্ট ভেরিয়েবল ...
-h - সাহায্য প্রদর্শন পতাকা সংজ্ঞা