Разбор строки в R - PullRequest
2 голосов
/ 12 марта 2012

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

myscript.R --arg1 = 100 --arg2 = 'hello' --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 ]

3 голосов
/ 12 марта 2012

Вы можете разбить каждый аргумент на части имени и значения, используя 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
2 голосов
/ 12 марта 2012
> 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

Чтобы решить проблему с неизвестным количеством модификаций аргументов:

 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...