如何防止命令行参数被 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
更改为 -j
,WARNING
就会消失……但我有充分的理由使用字母 g
!
R
和 Rscript
命令知道 --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
我正在使用 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
!
R
和 Rscript
命令知道 --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