我通常在Python中使用argparse,在R中使用docopt。我从argparse中错过的一个功能是为每个参数指定所需的数据类型。例如,在argparse中,我需要使用输入整数
parser.add_argument("square", help="display a square of a given number",
type=int)
在docopt/R中,我在文档中找不到任何关于需要特定数据类型的内容。
-s <square>, --square=<square> display a square of a given number #additional option to require integer input?
Python版本的docopt GitHub repo存在一个封闭的问题,这似乎表明这不是基本docopt的一部分,并为Python提供了一个解决方案,但这并不直接适用于R。有人能提供任何建议/更优雅的方法来使用docopt in R验证参数输入吗?
不确定这是否足够优雅,因为它涉及设置默认值,然后使用utils::type.convert
确定的类/类型
"Usage: my_program.R [-hson FILE] [--quiet | --verbose] [INPUT ...]
-h --help show this
-s --sorted sorted output
--coefficient=K [default: 2.95] The K coefficient
--numSim=K [default: 200] number of simulations
--output=FILE [default: test.txt] Output file
--directory=DIR [default: ./] Some directory
-o FILE specify output file [default: ./test.txt]
--quiet print less text
--verbose print more text" -> doc
opts <- docopt(doc, "-s --quiet")
str(opts)
newopts <- lapply(opts, function(x) utils::type.convert(as.character(x),as.is=T))
(definedClasses <- unlist(lapply(newopts, typeof)))
当您运行程序时,您可以根据这个definedClasses
测试输入。
您可能还想查看getopt
和optparse
/argparse
包,以及R脚本中的SO post Parsing命令行参数
参考文献:
http://docopt.org
http://rgrannell1.github.io/blog/2014/08/04/command-line-interfaces-in-r
http://docopt.readthedocs.org/en/0.2.0/
我有点好奇为什么不将docopt
与python一起使用,或者为什么不在R中使用argparse
(或optparse
)?
如果你想知道这是如何用optparse
R包实现你要求的功能:
> library("optparse")
> parser = OptionParser()
> parser = add_option(parser, c("-s", "--square"),
+ type="integer",
+ help="display a square of a given number")
> typeof(parse_args(parser, "--square=5")$square)
[1] "integer"
如何使用argparse
包(后一个包有python依赖项):
> parser = argparse::ArgumentParser()
> parser$add_argument("-s", "--square",
+ type="integer",
+ help="display a square of a given number")
> typeof(parser$parse_args("--square=5")$square)
[1] "integer"