【问题标题】:Parsing a string in R在 R 中解析字符串
【发布时间】:2012-03-11 22:06:39
【问题描述】:

我正在编写一个 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)
}

有人可以帮忙填空吗?

【问题讨论】:

    标签: r


    【解决方案1】:
    > 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
    

    【讨论】:

    • 啊,我很高兴我在这里提出了要求 - 我要花很长时间才能想出那个解决方案。一个快速的问题 - 关于未指定参数的默认值。我举的例子有点做作。从您提供的 sn-p 中不清楚如何确定在命令行中未提供哪些参数,以便可以替换默认值。你能澄清一下吗?谢谢!
    • 在函数内部,您可以使用 ls() 找出本地存在哪些对象。您可以遍历所有本地对象作为 arg 条目的名称,并使用 get() 来提供值。我将添加代码。
    • 谢谢。对我来说有很多有趣的新东西。不确定我是否理解所有内容(很多魔法正在发生),但我希望从代码中学习。
    • DWIn:你能解释一下这个神秘表达的含义吗? for( ar in ls()[! ls() %in% c("text1", "args")] ) - 这是我不明白的列表理解部分。谢谢!
    • 我只是从添加到列表 args 的项目中删除了其他本地命名对象 text1argsls() 返回本地环境中所有对象名称的字符向量,除非您将其指向不同的环境。
    【解决方案2】:

    您可以将每个参数拆分为 名称和值部分,使用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-02
      • 1970-01-01
      • 2015-04-22
      • 2020-07-31
      • 1970-01-01
      • 2022-08-08
      • 1970-01-01
      • 2010-11-07
      相关资源
      最近更新 更多