在命令行(终端)上使用R脚本的最佳方法是什么?

bla*_*lah 112 bash r

使用R脚本从命令行执行简单绘图非常方便.但是,从bash脚本运行R并不方便.理想可能是这样的

#!/path/to/R
...
Run Code Online (Sandbox Code Playgroud)

要么

#!/usr/bin/env R
...
Run Code Online (Sandbox Code Playgroud)

但我无法完成其中任何一项工作.

另一个选择是将脚本纯粹保存在R中,例如script.R,并使用R --file=script.R或类似地调用它.但是,有时脚本会依赖于模糊的命令行开关,此时代码的一部分存在于脚本之外.例如:通过本地.Rprofile将事物从bash偷偷带入R中,所需的开关就是一切--vanilla意味着除外--no-init-file.

另一种选择是用于存储R标志的bash脚本,并且可以无痛地执行,然后调用R脚本.问题是,这意味着单个程序被分成两个文件,现在必须保持同步,一起转移到新机器等.

我目前最鄙视的选项是将R嵌入到bash脚本中:

#!/bin/bash
... # usage message to catch bad input without invoking R
... # any bash pre-processing of input
... # etc
R --random-flags <<RSCRIPT
# R code goes here
RSCRIPT
Run Code Online (Sandbox Code Playgroud)

一切都在一个文件中.它是可执行的,可以轻松处理参数.问题是像这样结合bash和R几乎消除了任何IDE不会在一个或另一个上失败的可能性,并且让我的心脏受到伤害.

我错过了一些更好的方法吗?

小智 126

内容script.r:

#!/usr/bin/env Rscript

args = commandArgs(trailingOnly = TRUE)
message(sprintf("Hello %s", args[1L]))
Run Code Online (Sandbox Code Playgroud)

从命令行调用:

chmod +x script.r
Run Code Online (Sandbox Code Playgroud)

  • 我们还提到`commandArgs`函数和`getopt`和`optparse`包来解析命令行.因此,从命令行运行时,参数和选项也可以传递给脚本. (7认同)
  • 从命令行运行`Rscript --help`将列出许多可以添加到shebang的有用选项,例如`--vanilla`. (5认同)
  • 请注意,这仅适用于`#!/usr/bin/Rscript`(** 不是** R 脚本的标准做法)。 (2认同)

Jou*_*nen 16

尝试利特勒.littler为GNU R提供hash-bang(即以#!/ some/path开头的脚本)功能,以及简单的命令行和管道使用.


The*_*hog 10

Miguel Sanchez的回应是应该的.执行Rscript的另一种方式可能是'env'命令来运行系统范围的RScript.

#!/usr/bin/env Rscript
Run Code Online (Sandbox Code Playgroud)


小智 9

#!/path/to/R不会起作用,因为R本身就是一个剧本,所以execve不开心.

我用 R --slave -f script

  • 对于休闲读者而言:很多这些答案都早于`Rscript`(和`littler`),以防你想知道. (3认同)
  • @michael 这里的答案都没有早于 Rscript,它于 2007 年随 R 2.5.0 一起发布。 (2认同)

小智 6

如果您有兴趣解析R脚本的命令行参数,请尝试与版本2.5.x中的R捆绑在一起的RScript

http://stat.ethz.ch/R-manual/R-patched/library/utils/html/Rscript.html