Смущен передачей аргументов из командной строки (optparse) R, аргументы не сохраняются даже при явной опции 'default' - PullRequest
1 голос
/ 04 мая 2019

Изучение, как использовать 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

1 Ответ

1 голос
/ 04 мая 2019

Частичное совпадение аргументов - ваш (наверное, не) друг.

#!/usr/bin/env Rscript
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)

print("R tries to match anything starting with an o.")
print(arguments$o)
print("No success")
print("R tries not to partially matchi anything. Explicitly call argument.")
print(arguments$outputPath)
print("Great success!")

Приведенный выше скрипт дает мне:

romunov@kista  ~/Documents
$ ./test.R
Loading required package: optparse
Warning message:
package 'optparse' was built under R version 3.5.3
[1] "R tries to match anything starting with an o."
NULL
[1] "No success"
[1] "R tries not to partially matchi anything. Explicitly call argument."
[1] "C:/Users/romunov/Documents"
[1] "Great success!"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...