对从命令行(optparse)R传递参数感到困惑,即使使用显式“默认”选项也没有存储参数

Posted

技术标签:

【中文标题】对从命令行(optparse)R传递参数感到困惑,即使使用显式“默认”选项也没有存储参数【英文标题】:Confused about passing arguments from command line (optparse) R, arguments not getting stored even with explicit 'default' option 【发布时间】:2019-05-04 18:45:22 【问题描述】:

学习如何从命令行使用 R。我遇到了“optparse”包并开始使用它。以为一切都很好,直到我注意到它的行为不像我最初预期的那样,并且无法让它在我想要的目录中写入文件。

为了简单起见,我决定用一个简短的脚本来解释发生了什么:

require(optparse)

#Parse arguments from command line
options <- list(
  make_option(c("-d", "--directory"), action = "store", default = getwd(), type = "character", help="Working directory path."),
  make_option(c("-e", "--extension"), action = "store", default = ".tsv", type = "character", help="File(s) extension."),
  make_option(c("-p", "--outputPath"), action = "store", default = getwd(), type = "character", help="Output file(s) directory to be saved at."),
  make_option(c("-o", "--outputName"), action = "store", default = "output", type = "character", help="Output file(s) base name."),
  make_option(c("-s", "--separator"), action = "store", default = NA, help="Separator to use explicitely")
)
arguments <- parse_args(OptionParser(option_list = options))

setwd(arguments$d) 

cat(arguments$d, arguments$e, arguments$s)

这很好用,它显示:

C:/Users/path/to/where/I/work .tsv NA

但是,要求 'outputPath' 和 outputName' 参数

cat(arguments$p, arguments$o)

绝对不会打印任何内容...即使我明确地为这些参数提供了默认值、类型和操作。 outputPath 选项实际上与 directory 选项相同!

使用 getwd()、as.character(getwd()) 或什至 as.character(file.path(getwd())) 对选项 'outputPath' 给出相同的结果。

从命令行传递参数(而不是使用默认值)返回完全相同的东西(你对 arguments$d、arguments$e、arguments$s 的期望,而对于 arguments$p、arguments 什么都没有$o)

我对此感到非常困惑;当然,当尝试在我的真实脚本中使用这些变量时......这是不可能的,因为它说它们的长度为零......

有趣的是,如果我这样做:

cat(unlist(arguments))

我确实得到了我期望的输出......但我还在我的参数列表的末尾得到了一个值为 FALSE 的附加逻辑变量。不知道从哪里来的……

C:/Users/path/to/where/I/work .tsv C:/Users/path/to/where/I/work output NA FALSE

我在 Windows powershell 上运行它:

Rscript.exe .\script.R

当我输入长标志(例如 --outputName 某些东西)时,标志“点亮”并在终端上变成白色,而使用短标志(例如 -o 东西)不会(它在终端上看起来是灰色的)命令行,好像它是未使用的或什么的)。不知道这是否意味着什么,因为两者都做完全相同的事情。只是想指出来。

最后一件事!当然 'C:/Users/path/to/where/I/work' 不是真正的目录路径,而我实际使用的路径上有一个空格……你认为这重要吗?

编辑:好的,现在我知道 FALSE 来自哪里,只需要打印我的“参数”列表......我觉得很愚蠢。但是,最初的问题仍然存在......现在让我更加困惑,因为这些值存储在我的“参数”列表中。

在做:

arguments

演出:

$directory
[1] "C:/Users/alang/Desktop/LabiVicenteLau D="

$extension
[1] ".tsv"

$outputPath
[1] "C:/Users/alang/Desktop/LabiVicenteLau D="

$output
[1] "output"

$separator
[1] NA

$help
[1] FALSE

【问题讨论】:

【参考方案1】:

参数的部分匹配是你的(我猜不是)朋友。

#!/usr/bin/env Rscript
require(optparse)

#Parse arguments from command line
options <- list(
  make_option(c("-d", "--directory"), action = "store", default = getwd(), type = "character", help="Working directory path."),
  make_option(c("-e", "--extension"), action = "store", default = ".tsv", type = "character", help="File(s) extension."),
  make_option(c("-p", "--outputPath"), action = "store", default = getwd(), type = "character", help="Output file(s) directory to be saved at."),
  make_option(c("-o", "--outputName"), action = "store", default = "output", type = "character", help="Output file(s) base name."),
  make_option(c("-s", "--separator"), action = "store", default = NA, help="Separator to use explicitely")
)
arguments <- parse_args(OptionParser(option_list = options))

setwd(arguments$d)

print("R tries to match anything starting with an o.")
print(arguments$o)
print("No success")
print("R tries not to partially matchi anything. Explicitly call argument.")
print(arguments$outputPath)
print("Great success!")

上面的脚本给了我:

romunov@kista  ~/Documents
$ ./test.R
Loading required package: optparse
Warning message:
package 'optparse' was built under R version 3.5.3
[1] "R tries to match anything starting with an o."
NULL
[1] "No success"
[1] "R tries not to partially matchi anything. Explicitly call argument."
[1] "C:/Users/romunov/Documents"
[1] "Great success!"

【讨论】:

是的,刚刚想通了 :D 谢谢!我认为可能有办法让它按照我最初尝试匹配的方式工作,但现在我会这样做。 您应该按参数的全名匹配参数。你的代码应该是可读的,而不是简短的。

以上是关于对从命令行(optparse)R传递参数感到困惑,即使使用显式“默认”选项也没有存储参数的主要内容,如果未能解决你的问题,请参考以下文章

对从异步函数返回的承诺感到非常困惑

python中optparse模块用法

Python 命令行参数解析: optparse 模块

python学习笔记14-optparse真正的命令行参数

python模块-optparse(解析命令行参数)

命令行之参数解析 optparse模块的运用