如何防止命令行args仅被我的脚本解释为R?

时间:2015-06-07 21:24:04

标签: r docopt

我正在使用R的docopt实现。我的脚本有一个命令行选项,其中短格式为-g。当我运行我的脚本时,似乎这个参数首先由R解释,然后由我的脚本解释。因此,我得到一个关于不指定GUI值的手腕拍。我可以阻止R尝试使用这些命令行参数吗?

脚本示例:

#!/usr/bin/Rscript

suppressPackageStartupMessages(library(docopt))

"docopt practice script

Usage: foo.R [-g <goodies>]

Options:
     -g <goodies>, --goodies=<goodies>  Goodies
" -> doc

opts <- docopt(doc)
cat(sprintf("goodies = %s\n", opts$goodies))

以下是我运行时会发生的事情:

Jennifers-MacBook-Pro-3:scripts jenny$ ./foo.R -g donuts
WARNING: --gui or -g without value ignored
goodies = donuts

如果您将选项的简短格式从-g更改为-j,则WARNING会消失......但我有充分的理由使用g这个字母!

2 个答案:

答案 0 :(得分:3)

RRscript命令知道--args。比较以下输出:

R -e "TRUE" --args --silent
R -e "TRUE" --silent

如果检测到--args,则会因early exit而生效。但是,--gui警告是在单独的循环before this中触发的。

这意味着

Rscript -e "commandArgs()" --args --gui

会起作用,但会发出虚假警告,

Rscript -e "commandArgs()" --gui

马上给出错误。看起来只有--gui-g会受到影响。

作为一个快速而肮脏的黑客,可以插入类似

的内容
if(!strcmp(*avv, "--args")) {
    break;
}

beginning of the GUI-check loop。在R中改变之前,我怀疑除了避免-g切换或接受(无其他无害)警告之外别无选择。

答案 1 :(得分:3)

正如@krlmlr所指出的,这个问题与Rscript(在你的哈希爆炸中)有关。一种解决方法是使用优秀littler提供的功能代替Rscript。例如,在#!/usr/bin/Rscript中使用foo.R,我就会遇到问题:

[nathan@nrussell R]$ ./foo.R -g donuts
WARNING: unknown gui 'donuts', using X11

goodies = donuts

在新脚本#!/usr/local/bin/r中用foo2.R替换它,我得到一个干净的输出:

[nathan@nrussell R]$ ./foo2.R -g donuts
goodies = donuts

看起来你是在OS X机器上,所以如果你选择安装littler,请务必注意作者&#39;警告:

  

在OS X上,您可能希望通过configure --program-prefix =&#34; l&#34;来构建它。   将其重命名为lr,因为该特定操作系统认为R和r是相同的