У меня есть R-скрипт, для которого я хотел бы иметь возможность предоставлять несколько параметров командной строки (а не значения параметров жесткого кода в самом коде). Скрипт работает на Windows.
Я не могу найти информацию о том, как прочитать параметры, указанные в командной строке, в мой R-скрипт. Я был бы удивлен, если это не может быть сделано, поэтому, возможно, я просто не использую лучшие ключевые слова в моем поиске Google ...
Есть указатели или рекомендации?
command-line
r
parameters
monch1962
источник
источник
Ответы:
Ответ Дирка здесь - все, что вам нужно. Вот минимальный воспроизводимый пример.
Я сделал два файла:
exmpl.bat
иexmpl.R
.exmpl.bat
:В качестве альтернативы, используя
Rterm.exe
:exmpl.R
:Сохраните оба файла в одном каталоге и запустите
exmpl.bat
. В результате вы получите:example.png
с некоторым сюжетомexmpl.batch
со всем, что было сделаноВы также можете добавить переменную окружения
%R_Script%
:и использовать его в своих пакетных сценариях как
%R_Script% <filename.r> <arguments>
Различия между
RScript
иRterm
:Rscript
имеет более простой синтаксисRscript
автоматически выбирает архитектуру на x64 (подробнее см. Установка и администрирование R, 2.6 Под-архитектуры )Rscript
нуждаетсяoptions(echo=TRUE)
в .R файле, если вы хотите записать команды в выходной файлисточник
Несколько моментов:
Параметры командной строки доступны через
commandArgs()
, так что смотритеhelp(commandArgs)
для обзора.Вы можете использовать
Rscript.exe
на всех платформах, включая Windows. Это поддержитcommandArgs()
. littler может быть портирован на Windows, но сейчас живет только на OS X и Linux.В CRAN есть два пакета дополнений - getopt и optparse, которые были написаны для анализа командной строки.
Редактирование в ноябре 2015: появились новые альтернативы, и я искренне рекомендую docopt .
источник
Добавьте это в начало вашего скрипта:
Затем вы можете ссылаться на аргументы, переданные как
args[1]
иargs[2]
т. Д.Тогда беги
Если ваши аргументы являются строками с пробелами, заключите их в двойные кавычки.
источник
Попробуйте библиотеку (getopt) ... если вы хотите, чтобы все было лучше. Например:
источник
вам нужно немного (произносится «маленький г»)
Дирк будет около 15 минут, чтобы уточнить;)
источник
Поскольку
optparse
в ответах уже упоминалось несколько раз, и он предоставляет исчерпывающий набор для обработки командной строки, вот краткий упрощенный пример того, как его можно использовать, предполагая, что входной файл существует:script.R:
Дан произвольный файл
blah.txt
с 23 строками.В командной строке:
Rscript script.R -h
выходыRscript script.R -n blah.txt
выходы[1] "69"
Rscript script.R -n -f 5 blah.txt
выходы[1] "115"
источник
В bash вы можете создать командную строку следующим образом:
Вы можете видеть, что переменная
$z
заменена оболочкой bash на «10», и это значение выбираетсяcommandArgs
и подается в негоargs[2]
, а команда диапазонаx=1:10
выполняется R успешно и т. Д. И т. Д.источник
К вашему сведению: есть функция args (), которая извлекает аргументы функций R, которые не следует путать с вектором аргументов с именем args
источник
Если вам нужно указать опции с флагами (например, -h, --help, --number = 42 и т. Д.), Вы можете использовать пакет optparse (вдохновленный Python): http://cran.r-project.org /web/packages/optparse/vignettes/optparse.pdf .
По крайней мере, так я понимаю ваш вопрос, потому что я нашел этот пост, когда искал эквивалент bash getopt, или perl Getopt, или python argparse и optparse.
источник
Я просто собрал красивую структуру данных и цепочку обработки для генерации такого переключения, библиотеки не нужны. Я уверен, что это будет реализовано много раз, и наткнулся на эту тему в поисках примеров - думал, что я скинуться
Мне даже не были нужны флаги (единственный флаг здесь - режим отладки, создающий переменную, которую я проверяю как условие запуска функции ниже по потоку
if (!exists(debug.mode)) {...} else {print(variables)})
. Приведенныеlapply
ниже операторы проверки флага выдают то же самое, что и:где
args
- переменная, считываемая из аргументов командной строки (символьный вектор, эквивалентный тому,c('--debug','--help')
когда вы, например, задаете их)Его можно использовать для любого другого флага, и вы избегаете всех повторений, и никаких библиотек, поэтому нет никаких зависимостей:
Обратите внимание, что
flag.details
здесь команды хранятся в виде строк, а затем оцениваются с помощьюeval(parse(text = '...'))
. Optparse, очевидно, желателен для любого серьезного скрипта, но код с минимальной функциональностью тоже иногда хорош.Образец вывода:
источник