126

使用 R 脚本从命令行进行简单绘图非常方便。但是,从 bash 脚本运行 R 一点也不方便。理想可能是这样的

#!/path/to/R
...

或者

#!/usr/bin/env R
...

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

另一种选择是将脚本纯粹保留在 R 中,例如,并使用或类似方法script.R调用它。R --file=script.R但是,有时脚本会依赖于晦涩的命令行开关,此时部分代码存在于脚本之外。示例:通过本地 .Rprofile 将东西从 bash 偷偷带入 R,所需的开关就是--vanilla--no-init-file.

另一种选择是一个 bash 脚本来存储 R 标志并且可以轻松执行,然后调用 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

一切都在一个文件中。它是可执行的并且很容易处理参数。问题是,像这样结合 bash 和 R 几乎消除了任何 IDE 不会在其中一个或另一个上失败的可能性,并且让我的心非常痛。

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

4

11 回答 11

148

内容script.r

#!/usr/bin/env Rscript

args = commandArgs(trailingOnly = TRUE)
message(sprintf("Hello %s", args[1L]))

第一行是shebang line。最佳做法是使用/usr/bin/env Rscript而不是硬编码 R 安装的路径。否则,您可能会冒着在其他计算机上破坏脚本的风险。

接下来,使其可执行(在命令行上):

chmod +x script.r

从命令行调用:

./script.r world
# Hello world
于 2009-06-09T12:03:40.747 回答
18

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

于 2009-04-15T11:37:36.170 回答
11

米格尔桑切斯的回应是应该的。执行 Rscript 的另一种方式可能是运行系统范围的 RScript 的“env”命令。

#!/usr/bin/env Rscript
于 2013-02-11T08:09:30.323 回答
9

#!/path/to/R不会工作,因为 R 本身就是一个脚本,所以execve不开心。

我用R --slave -f script

于 2009-05-05T03:50:25.733 回答
6

如果您有兴趣将命令行参数解析到 R 脚本,请尝试 RScript,它与 R 捆绑在一起,从 2.5.x 版本开始

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

于 2011-03-14T12:13:40.667 回答
4

这行得通,

#!/usr/bin/Rscript

但我不知道如果您的机器上安装了超过 1 个版本的 R 会发生什么。

如果你这样做

#!/usr/bin/env Rscript

它告诉解释器只使用路径上首先出现的任何 R。

于 2014-02-25T22:22:07.870 回答
2

如果您用来执行脚本的程序需要参数,您可以将它们放在 #! 的末尾。线:

#!/usr/bin/R --random --switches --f

不知道 R,我无法正确测试,但这似乎有效:

axa@artemis:~$ cat r.test
#!/usr/bin/R -q -f
error
axa@artemis:~$ ./r.test
> #!/usr/bin/R -q -f
> error
Error: object "error" not found
Execution halted
axa@artemis:~$
于 2009-04-15T22:07:38.807 回答
2

只是要添加到这篇文章的注释。后来的版本R似乎Rscript有些埋没了。对于 2015 年 1 月下载的 OSX 上的 R 3.1.2-1,我Rscript

/sw/Library/Frameworks/R.framework/Versions/3.1/Resources/bin/Rscript

#! /sw/bin/Rscript因此,我需要在脚本顶部使用以下内容,而不是类似的内容。

#! /sw/Library/Frameworks/R.framework/Versions/3.1/Resources/bin/Rscript

locate Rscript可能对你有帮助。

于 2015-01-15T10:38:30.137 回答
0

您可能想使用 python 的 rpy2 模块。但是,执行此操作的“正确”方法是使用 R CMD BATCH。您可以修改它以写入 STDOUT,但默认是写入 .Rout 文件。请参见下面的示例:

[ramanujan:~]$cat foo.R
print(rnorm(10))
[ramanujan:~]$R CMD BATCH foo.R
[ramanujan:~]$cat foo.Rout

R version 2.7.2 (2008-08-25)
Copyright (C) 2008 The R Foundation for Statistical Computing
ISBN 3-900051-07-0

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

[Previously saved workspace restored]


 ~/.Rprofile loaded.
Welcome at  Fri Apr 17 13:33:17 2009
> print(rnorm(10))
 [1]  1.5891276  1.1219071 -0.6110963  0.1579430 -0.3104579  1.0072677 -0.1303165  0.6998849  1.9918643 -1.2390156
>

Goodbye at  Fri Apr 17 13:33:17 2009
> proc.time()
   user  system elapsed
  0.614   0.050   0.721

注意:您需要尝试使用 --vanilla 和其他选项来删除所有启动垃圾。

于 2009-04-17T20:35:26.933 回答
0

尝试使用 smallR 在命令行中编写快速 R 脚本:

http://code.google.com/p/simple-r/

r目录中的命令)

使用 smallR 从命令行绘图将如下所示:

r -p file.txt
于 2013-09-26T01:23:21.837 回答
-1

以下适用于我在 Windows 上使用 MSYS bash - 我的 Linux 机器上没有 R,所以不能在那里尝试。您需要两个文件 - 第一个名为runr的文件使用文件参数执行 R

# this is runr
# following is path to R on my Windows machine
# plus any R params you need
c:/r/bin/r --file=$1

您需要使用chmod +x runr使这个可执行文件。

然后在你的脚本文件中:

#!runr
# some R commands
x = 1
x

注意#! runr 行可能需要包含 runr 的完整路径,具体取决于您使用命令的方式、PATH 变量的设置方式等。

不漂亮,但它似乎确实有效!

于 2009-04-15T08:58:03.103 回答