Изучение, как использовать R из командной строки. Я наткнулся на пакет «optparse» и начал его использовать. Думал, что все хорошо, пока я заметил, что он не ведет себя так, как я изначально ожидал, и не смог заставить его записать файл в каталог, который я хотел.
Для простоты я решил использовать короткий сценарий, чтобы объяснить, что происходит:
require(optparse)
#Parse arguments from command line
options <- list(
make_option(c("-d", "--directory"), action = "store", default = getwd(), type = "character", help="Working directory path."),
make_option(c("-e", "--extension"), action = "store", default = ".tsv", type = "character", help="File(s) extension."),
make_option(c("-p", "--outputPath"), action = "store", default = getwd(), type = "character", help="Output file(s) directory to be saved at."),
make_option(c("-o", "--outputName"), action = "store", default = "output", type = "character", help="Output file(s) base name."),
make_option(c("-s", "--separator"), action = "store", default = NA, help="Separator to use explicitely")
)
arguments <- parse_args(OptionParser(option_list = options))
setwd(arguments$d)
cat(arguments$d, arguments$e, arguments$s)
Это отлично работает, показывает:
C:/Users/path/to/where/I/work .tsv NA
Однако, запрашивая аргументы 'outputPath' и outputName '
cat(arguments$p, arguments$o)
абсолютно ничего не печатает ... хотя я явно дал этим аргументам значение по умолчанию, тип и действие. Параметр outputPath буквально совпадает с параметром каталога!
Использование getwd (), as.character (getwd ()) или даже as.character (file.path (getwd ())) дает тот же результат для опции 'outputPath'.
Передача аргументов из командной строки (вместо использования значений по умолчанию) возвращает точно такую же вещь (что вы ожидаете для аргументов $ d, аргументов $ e, аргументов $ s и ничего для аргументов $ p, аргументов $ о)
Я очень смущен этим; и, конечно, при попытке работать с этими переменными в моем реальном скрипте ... ну, это невозможно, потому что он говорит, что они имеют нулевую длину ...
Интересно, если я сделаю:
cat(unlist(arguments))
Я получаю вывод, который ожидаю ... но я также получаю дополнительную логическую переменную со значением FALSE в конце списка аргументов. Я не знаю, откуда это взялось ...
C:/Users/path/to/where/I/work .tsv C:/Users/path/to/where/I/work output NA FALSE
Я запускаю это на Windows PowerShell как:
Rscript.exe .\script.R
Когда я набираю длинный флаг (например, --outputName что-то), флаг «загорается» и становится белым на терминале, тогда как использование короткого (например, -о чего-то) не делает (он выглядит сероватым на командная строка, как будто она не используется или что-то). Не знаю, означает ли это что-нибудь, так как оба делают одно и то же. Просто хотел указать на это.
И последнее! Конечно, 'C: / Users / path / to / where / I / work' не является реальным путем к каталогу, и тот, который я на самом деле использую, содержит пробел ... как вы думаете, это имеет значение?
РЕДАКТИРОВАТЬ: Хорошо, теперь я знаю, откуда это ЛОЖЬ, просто нужно было распечатать мой список «аргументов» ... Я чувствую себя глупо. Но, тем не менее, первоначальная проблема сохраняется ... и теперь меня это смущает, потому что значения хранятся в моем списке аргументов.
Выполнение:
arguments
Показывает:
$directory
[1] "C:/Users/alang/Desktop/LabiVicenteLau D="
$extension
[1] ".tsv"
$outputPath
[1] "C:/Users/alang/Desktop/LabiVicenteLau D="
$output
[1] "output"
$separator
[1] NA
$help
[1] FALSE