Passing command line arguments to R CMD BATCH

前端 未结 6 650
你的背包
你的背包 2020-11-27 09:22

I have been using R CMD BATCH my_script.R from a terminal to execute an R script. I am now at the point where I would like to pass an argument to

6条回答
  •  轮回少年
    2020-11-27 10:00

    Here's another way to process command line args, using R CMD BATCH. My approach, which builds on an earlier answer here, lets you specify arguments at the command line and, in your R script, give some or all of them default values.

    Here's an R file, which I name test.R:

    defaults <- list(a=1, b=c(1,1,1)) ## default values of any arguments we might pass
    
    ## parse each command arg, loading it into global environment
    for (arg in commandArgs(TRUE))
      eval(parse(text=arg))
    
    ## if any variable named in defaults doesn't exist, then create it
    ## with value from defaults
    for (nm in names(defaults))
      assign(nm, mget(nm, ifnotfound=list(defaults[[nm]]))[[1]])
    
    print(a)
    print(b)
    

    At the command line, if I type

    R CMD BATCH --no-save --no-restore '--args a=2 b=c(2,5,6)' test.R
    

    then within R we'll have a = 2 and b = c(2,5,6). But I could, say, omit b, and add in another argument c:

    R CMD BATCH --no-save --no-restore '--args a=2 c="hello"' test.R
    

    Then in R we'll have a = 2, b = c(1,1,1) (the default), and c = "hello".

    Finally, for convenience we can wrap the R code in a function, as long as we're careful about the environment:

    ## defaults should be either NULL or a named list
    parseCommandArgs <- function(defaults=NULL, envir=globalenv()) {
      for (arg in commandArgs(TRUE))
        eval(parse(text=arg), envir=envir)
    
      for (nm in names(defaults))
        assign(nm, mget(nm, ifnotfound=list(defaults[[nm]]), envir=envir)[[1]], pos=envir)
    }
    
    ## example usage:
    parseCommandArgs(list(a=1, b=c(1,1,1)))
    

提交回复
热议问题