Не удается передать два числовых аргумента с пакетом docopt

При создании инструмента командной строки с помощью R я решил использовать пакет docopt. Это работает для передачи флагов, но я не могу понять, как передать два числовых значения. См. приведенный ниже код:

#! /usr/bin/Rscript

'usage: ./test.R [-lr <low> -hr <high>]

options:
 -h --help         Shows this screen
 -lr --low <low>         Passes low risk investiment
 -hr --high <high>        Passes high risk investiment' -> doc

library(docopt)
# retrieve the command-line arguments
opts <- docopt(doc)
# what are the options? Note that stripped versions of the parameters are added to the returned list
cat(opts$high)
cat(opts$low)
str(opts) 

Всякий раз, когда я пытаюсь запустить с помощью ./test.R -lr 2000 -hr 4000, он предупреждает меня, что загружается пакет методов, и больше ничего не возвращает.

  • В чем здесь моя ошибка?

person lf_araujo    schedule 11.09.2017    source источник


Ответы (1)


Во-первых, -h указывается дважды: один раз для "помощи", другой для "высокого", так что там у вас возникнут проблемы. Чтобы исправить это, я буду использовать заглавные буквы для кратких аргументов. Во-вторых, аргумент опции должен быть либо <angular-brackets>, либо ЗАГЛАВНЫМИ, поэтому -lr не работает. (Очевидно, ему также нужен пробел между параметром и его аргументом.) Я расширю его, чтобы он содержал аргументы с теми же именами, что и для длинных параметров.

Кроме того (хотя, возможно, это и не обязательно), я думаю, что запятая помогает прояснить ситуацию. (Правка: очевидно, docopt.R не нравится лидирующее ./ при использовании, поэтому я обновил вывод.)

usage: test.R [-L <low> -H <high>]

options:
 -h, --help                 Shows this screen
 -L <low>, --low <low>     Passes low risk investiment
 -H <high>, --high <high>  Passes high risk investiment

(Я нашел требования для docopt на http://docopt.org/. Я обнаружил, что их интерактивная демонстрация docopt тоже работала неплохо.)

person r2evans    schedule 11.09.2017
comment
Спасибо за подробный ответ, однако это должно быть ошибка в R (версия R 3.4.1) с docopt из CRAN, потому что, к сожалению, он не работает. - person lf_araujo; 11.09.2017
comment
Хорошо, извините, я изначально интерпретировал это как проблему с docopt в целом (с которой ваша исходная версия несовместима), а не с реализацией R (которая, похоже, не работает с любой версией). Я вижу, что вы уже отправили отчет об ошибке намного раньше меня. - person r2evans; 11.09.2017
comment
Я нашел ошибку. Итерация R docopt не обрабатывает ./test.R в разделе использования, это должно быть test.R - person lf_araujo; 11.09.2017