docopt - требует определенного типа данных для каждого аргумента

Обычно я использую argparse в Python и docopt в R. Одна из функций, которые мне не хватает в argparse, но которую я еще не понял в docopt, - это возможность указать требуемый тип данных для каждого аргумента. Например, в 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 есть закрытая проблема, которая, похоже, указывает на то, что это не является частью базового docopt и предлагает решение для Python, но это напрямую не применимо к R. Может ли кто-нибудь предложить какие-либо предложения / более элегантный способ проверки вводимых аргументов с помощью docopt в R?


person AJW    schedule 18.04.2016    source источник


Ответы (2)


не уверен, что это достаточно элегантно, поскольку оно включает в себя установку значений по умолчанию, а затем использование 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 и _5 _ / _ 6_, а также с этим сообщением SO Анализ аргументов командной строки в сценариях R

Использованная литература:

http://docopt.org

http://rgrannell1.github.io/blog/2014/08/04/command-line-interfaces-in-r

http://docopt.readthedocs.org/en/0.2.0/

person chinsoon12    schedule 19.04.2016
comment
Спасибо, это интересная информация. Я могу поэкспериментировать с этим подходом в будущем. В итоге я использовал пакет testthat для написания тестов, чтобы проверить, соответствует ли ввод пользователя ожиданиям. - person AJW; 10.05.2016

Мне немного любопытно, почему вы не используете docopt с python или почему вы не используете argparse (или optparse) в R?

Если вам интересно, как выполнить запрошенную функцию с пакетом 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"
person Trevor    schedule 30.11.2018