2012-03-11 22 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 

は、問題の修正:

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