我有一个R脚本,我希望能够提供几个命令行参数(而不是在代码本身硬编码参数值)。该脚本运行在Windows系统上。

我找不到关于如何将命令行上提供的参数读到我的R脚本的信息。如果这不能做到,我会感到惊讶,所以也许我只是没有在我的谷歌搜索中使用最好的关键字…

有什么建议吗?


当前回答

把这个添加到你的脚本顶部:

args<-commandArgs(TRUE)

然后你可以引用传入的参数args[1], args[2]等。

然后运行

Rscript myscript.R arg1 arg2 arg3

如果参数是带空格的字符串,请用双引号括起来。

其他回答

以下几点:

命令行参数为 可以通过commanddargs()访问,因此 参见help(commandArgs)获取an 概述。 你可以在包括Windows在内的所有平台上使用Rscript.exe。它将支持commandArgs()。little可以移植到Windows上,但目前只能移植到OS X和Linux上。 CRAN上有两个附加包——getopt和optparse——它们都是为命令行解析而编写的。

编辑于2015年11月:新的替代方案已经出现,我全心全意地推荐docopt。

供您参考:有一个函数args(),它检索R个函数的参数,不要与名为args的参数向量混淆

我只是把一个漂亮的数据结构和处理链放在一起来生成这种切换行为,不需要库。我相信它已经被实现过无数次了,并且在这个帖子中寻找例子-我想我应该分享一下。

我甚至不需要特别的标志(这里唯一的标志是调试模式,创建一个变量,我检查作为启动下游函数的条件,如果(!exists(debug.mode)){…} else {print(variables)})。下面的标志检查lapply语句产生的结果与:

if ("--debug" %in% args) debug.mode <- T
if ("-h" %in% args || "--help" %in% args) 

其中args是从命令行参数中读入的变量(一个字符向量,相当于c('——debug','——help'),例如当你提供这些时)

它可用于任何其他标志,你避免了所有的重复,没有库,所以没有依赖:

args <- commandArgs(TRUE)

flag.details <- list(
"debug" = list(
  def = "Print variables rather than executing function XYZ...",
  flag = "--debug",
  output = "debug.mode <- T"),
"help" = list(
  def = "Display flag definitions",
  flag = c("-h","--help"),
  output = "cat(help.prompt)") )

flag.conditions <- lapply(flag.details, function(x) {
  paste0(paste0('"',x$flag,'"'), sep = " %in% args", collapse = " || ")
})
flag.truth.table <- unlist(lapply(flag.conditions, function(x) {
  if (eval(parse(text = x))) {
    return(T)
  } else return(F)
}))

help.prompts <- lapply(names(flag.truth.table), function(x){
# joins 2-space-separatated flags with a tab-space to the flag description
  paste0(c(paste0(flag.details[x][[1]][['flag']], collapse="  "),
  flag.details[x][[1]][['def']]), collapse="\t")
} )

help.prompt <- paste(c(unlist(help.prompts),''),collapse="\n\n")

# The following lines handle the flags, running the corresponding 'output' entry in flag.details for any supplied
flag.output <- unlist(lapply(names(flag.truth.table), function(x){
  if (flag.truth.table[x]) return(flag.details[x][[1]][['output']])
}))
eval(parse(text = flag.output))

注意,在flag.details中,命令被存储为字符串,然后用eval(parse(text = '…'))进行计算。对于任何严肃的脚本来说,Optparse显然都是可取的,但功能很少的代码有时也很好。

样例输出:

$ Rscript check_mail.Rscript --help
--debug Print  variables rather than executing function XYZ...

-h  --help  Display flag definitions

你需要little(发音为'little r')

Dirk将在大约15分钟后来详细说明;)

Try library(getopt)…如果你想让事情变得更好。例如:

spec <- matrix(c(
        'in'     , 'i', 1, "character", "file from fastq-stats -x (required)",
        'gc'     , 'g', 1, "character", "input gc content file (optional)",
        'out'    , 'o', 1, "character", "output filename (optional)",
        'help'   , 'h', 0, "logical",   "this help"
),ncol=5,byrow=T)

opt = getopt(spec);

if (!is.null(opt$help) || is.null(opt$in)) {
    cat(paste(getopt(spec, usage=T),"\n"));
    q();
}