Tôi chỉ cần kết hợp một cấu trúc dữ liệu đẹp và chuỗi xử lý để tạo hành vi chuyển đổi này, không cần thư viện. Tôi chắc chắn rằng nó sẽ được thực hiện nhiều lần và đã bắt gặp chủ đề này để tìm kiếm các ví dụ - nghĩ rằng tôi đã gắn chip.
Tôi thậm chí không cần cờ đặc biệt (cờ duy nhất ở đây là chế độ gỡ lỗi, tạo một biến mà tôi kiểm tra như một điều kiện để bắt đầu một hàm hạ lưu if (!exists(debug.mode)) {...} else {print(variables)})
. Các lapply
câu lệnh kiểm tra cờ dưới đây tạo ra giống như:
if ("--debug" %in% args) debug.mode <- T
if ("-h" %in% args || "--help" %in% args)
trong đó args
biến được đọc từ các đối số dòng lệnh (vectơ ký tự, tương đương với c('--debug','--help')
khi bạn cung cấp các ví dụ này)
Nó có thể tái sử dụng cho bất kỳ cờ nào khác và bạn tránh tất cả sự lặp lại và không có thư viện nên không phụ thuộc:
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))
Lưu ý rằng ở flag.details
đây các lệnh được lưu trữ dưới dạng chuỗi, sau đó được ước tính bằng eval(parse(text = '...'))
. Optparse rõ ràng là mong muốn cho bất kỳ tập lệnh nghiêm trọng nào, nhưng mã chức năng tối thiểu đôi khi cũng tốt.
Đầu ra mẫu:
$ Rscript check_mail.Rscript --help
--debug In các biến thay vì thực thi chức năng XYZ ...
-h - Trợ giúp Hiển thị định nghĩa cờ