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

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

#!/path/to/R
...

或者

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

但这两样我都做不到。

另一种选择是将脚本完全保存在 R 中,例如 script.R,并使用 R --file=script.R或类似方法调用它。但是,有时候脚本会依赖于模糊的命令行开关,此时部分代码存在于脚本之外。示例: 通过局部。所需的开关就是除了 --no-init-file之外 --vanilla所暗示的一切。

另一个选项是 bash 脚本,它存储 R 标志并且可以无痛执行,然后调用 R 脚本。问题是,这意味着一个单独的程序被分割成两个文件,现在必须保持同步,一起传输到新的机器上,等等。

目前我最不喜欢的选项是在 bash 脚本中嵌入 R:

#!/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 在其中一个或另一个上不会失败的可能性,这让我非常伤心。

还有什么更好的办法吗?

142886 次浏览

下面的工作为我使用 MSYS bash 在 Windows 上-我没有在我的 Linux 框 R,所以不能尝试它那里。您需要两个文件-第一个名为 快跑的文件使用 file 参数执行 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 变量的设置等等。

虽然不怎么样,但看起来确实管用!

试试 小一点littler提供了 hash-bang (即以 # 开始的脚本!/some/path)功能,以及简单的命令行和管道使用。

如果用于执行脚本的程序需要参数,可以将它们放在 # 后面!电话:

#!/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:~$

您可能希望使用 python 的 rpy2模块。然而,这样做的“正确”方法是使用 R CMD BATCH。您可以修改它以写入 STDOUT,但默认设置是写入。路由文件。请看下面的例子:

[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

注意: 您可能希望尝试使用——香草和其他选项来删除所有的启动信息。

因为 R 本身就是一个脚本,所以 #!/path/to/R不能工作,所以 execve不满意。

我用 R --slave -f script

script.r内容:

#!/usr/bin/env Rscript


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

第一行是 一字排开。使用 /usr/bin/env Rscript而不是硬编码到 R 安装的路径是最佳实践。否则,您可能会在其他计算机上出现脚本中断的情况。

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

chmod +x script.r

从命令行调用:

./script.r world
# Hello world

如果您对将命令行参数解析为 R 脚本感兴趣,可以尝试 RScript,它在2.5版本中与 R 绑定在一起。X

Http://stat.ethz.ch/r-manual/r-patched/library/utils/html/rscript.html

Miguel Sanchez 的回答是正确的。执行 RScript 的另一种方式可以是“ env”命令来运行系统范围的 RScript。

#!/usr/bin/env Rscript

尝试在命令行中编写小 R 脚本:

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

(目录中的 r命令)

使用 small R 从命令行进行绘图如下所示:

r -p file.txt

这样行得通,

#!/usr/bin/Rscript

但是我不知道如果在您的机器上安装了多于一个版本的 R 会发生什么。

如果你这样做

#!/usr/bin/env Rscript

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

只是一个添加到这篇文章的注释。R的后期版本似乎在某种程度上掩盖了 Rscript。对于 R3.1.2-1在 OSX 上下载2015年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可能对你有帮助。