如何防止命令行参数被 R 解释,而仅由我的脚本解释?

How to prevent command line args from being interpreted by R vs. only by my script?

我正在使用 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 更改为 -jWARNING 就会消失……但我有充分的理由使用字母 g!

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

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

这是由于 early exit if --args is detected. However, the --gui warning is triggered in a separate loop 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 开关或接受(否则无害的)警告。

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

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

goodies = donuts

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

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

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

On OS X, you may want to build it via configure --program-prefix="l" to renamed it to lr as that particular OS thinks R and r are the same