我正在使用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
这个字母!
答案 0 :(得分:3)
R
和Rscript
命令知道--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是相同的