2015-05-20 3 views
0

Я хочу, чтобы иметь дополнительный позиционный аргумент командной строки для моего R сценария и предположил, что это будет в порядке:Необязательный аргумент командной строки в R сценария

args <- commandArgs(trailingOnly = TRUE) 
infile <- args[1] 
outfile <- tryCatch(args[2], 
    error=function(cond) { 
     "default.txt" 
    } 
) 

Но R не ошибка, когда массив доступен за его длины:

> x <- c(1,2,3) 
> x[4] 
[1] NA 

Я не могу использовать missing по какой-то причине:

> missing(args[2]) 
Error in missing(args[2]) : invalid use of 'missing' 

Итак, как я могу проверить отсутствие второго аргумента командной строки и при необходимости вставить значение по умолчанию?

+3

Извините, но то, что есть вопрос/проблема? –

+0

Вы можете сделать 'outfile <-if (length (args) == 1)" default.txt "else args [2]'. – nicola

ответ

1

Индексирование вектора за пределами его длины не является ошибкой и просто возвращает NA, как вы обнаружили.

В вызове функции missing() проверяет, имеет ли параметр функции (также называемый формальным аргументом) аргумент вызывающего абонента, поэтому неправильно использовать его для чего-либо, что не является параметром функции, и неправильно использовать его вне тела функции.

Вот как бы я это сделать:

args <- commandArgs(trailingOnly=T); 
argsLen <- length(args); 
if (argsLen > 2) stop('error: too many arguments.'); 
if (argsLen < 1) stop('error: missing infile.'); 
infile <- args[1]; 
outfile <- if (argsLen < 2) 'default.txt' else args[2]; 
print(infile); 
print(outfile); 

Демо:

./script.r; 
## Error: error: missing infile. 
## Execution halted 

./script.r a; 
## [1] "a" 
## [1] "default.txt" 

./script.r a b; 
## [1] "a" 
## [1] "b" 

./script.r a b c; 
## Error: error: too many arguments. 
## Execution halted 
Смежные вопросы