2012-03-11 2 views
2

Я пишу сценарий R, который я буду запускать как скрипт из командной строки. Я передаю аргументы командной строки сценария с помощью ключевых слов следующим образом:Разбор строки в R

myscript.R --arg1 = 100 --arg2 = «привет» --arg3 = 3,14159

Я хочу написать функцию R, что вернет значения командной строки в словарь, подобный объекту (т. е. список списков в R), заполняя неподдерживаемые аргументы значениями по умолчанию.

, например.

parseArguments <- function() { 
    options <- commandArgs(TRUE) 

    # options now contains "--arg1=100 --arg2='hello' --arg3=3.14159" 
    # parse string held in variable named options and stuff into a list 
    # .... Do some string manip .... 

    args <- list() 
    args['arg1'] <- 100 
    args['arg2'] <- 'hello' 
    args['arg3'] <- 3.14159 
    args['arg4'] <- 123 # Not found in parsed line so we use a hard coded default 

    return (args) 
} 

Может кто-то помочь заполнить пробелы?

ответ

2
> parseArguments <- function() { 
+  text1 = "--arg1=100 --arg2='hello' --arg3=3.14159" 
+  eval(parse(text= gsub("\\s", ";", gsub("--","", text1)))) 
+  args <- list() 
+  args['arg1'] <- arg1 
+  args['arg2'] <- arg2 
+  args['arg3'] <- arg3 
+  args['arg4'] <- 123 # Not found in parsed line so we use a hard coded default 
+ 
+  return (args) 
+ } 
> argres <- parseArguments() 
> argres 
$arg1 
[1] 100 

$arg2 
[1] "hello" 

$arg3 
[1] 3.14159 

$arg4 
[1] 123 

Для решения UNKOWN ряда изменений аргументы к проблеме:

parseArguments <- function() { 
    text1 = "--arg1=100 --arg2='hello' --arg3=3.14159" 
    eval(parse(text=gsub("\\s", ";", gsub("--","", text1)))) 
    args <- list() 
    for(ar in ls()[! ls() %in% c("text1", "args")]) {args[ar] <- get(ar)} 
    return (args) 
} 
argres <- parseArguments() 
argres 
#--------- 
$arg1 
[1] 100 

$arg2 
[1] "hello" 

$arg3 
[1] 3.14159 
+0

А, я рад, что я спросил здесь - мне потребовалось бы навсегда придумать это решение. Один быстрый вопрос - относительно значений по умолчанию для аргументов, не указанных. Пример, который я дал, немного надуман. Из приведенного фрагмента не ясно, как определить, какие аргументы не были указаны в командной строке, чтобы можно было заменить значения по умолчанию. Не могли бы вы прояснить это? Благодаря! –

+0

Внутри функции вы можете использовать ls(), чтобы узнать, какие объекты существуют локально. Вы можете перебрать все локальные объекты в виде имен в записи arg и использовать get() для предоставления значений. Я добавлю код. –

+0

Спасибо. Множество интересных новых вещей для меня. Не уверен, что я все понимаю (много магии продолжается), но я надеюсь научиться из кода. –

3

Вы можете разбить каждый аргумент в имя и часть стоимости, используя strsplit или регулярное выражение. Следующие не пытаются проверить тип аргументов: все будет возвращено в виде строки.

parseArgs <- function(...) { 
    o <- commandArgs(TRUE) 
    # The defaults arguments should be named 
    defaults <- list(...) 
    stopifnot(length(defaults) == length(names(defaults))) 
    stopifnot(all(names(defaults) != "")) 
    # All the arguments should be of the form "--foo=bar" 
    re <- "^--(.*?)=(.*)" 
    stopifnot(all(grepl(re, o))) 
    # Extract the values and names 
    r <- gsub(re, "\\2", o) 
    names(r) <- gsub("^--(.*?)=(.*)", "\\1", o) 
    r <- as.list(r) 
    # Add the default values 
    missing <- setdiff(names(defaults), names(r)) 
    append(r, defaults[missing]) 
} 
print(parseArgs()) 
print(parseArgs(foo=1, bar=2)) # With default values