7

我正在使用 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

如果您将选项的缩写形式从-gto更改为-jWARNING则消失……但我有充分的理由使用该字母g

4

2 回答 2

3

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

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

如果检测到,这是由于提前退出而起作用的。--args但是,警告是在 this 之前--gui的单独循环中触发的。

这意味着

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

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

Rscript -e "commandArgs()" --gui

立即给出错误。它看起来只是--gui并且-g受到影响。

作为一种快速而肮脏的黑客,人们可以插入类似的东西

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

GUI 检查循环的开头-g在 R 中改变这一点之前,我怀疑除了避免切换或接受(否则无害的)警告之外别无选择。

于 2015-06-07T22:13:19.273 回答
3

正如@krlmlr 所指出的,这个问题与Rscript(在你的哈希爆炸中)有关。一种解决方法是使用优秀的littler提供的功能来代替Rscript. 例如,使用#!/usr/bin/Rscriptin 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 机器上,所以如果您选择 install littler,请务必注意作者的警告:

在 OS X 上,您可能希望通过 configure --program-prefix="l" 将其重命名为 lr 因为特定操作系统认为 R 和 r 相同

于 2015-06-07T22:21:07.767 回答