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

时间:2009-04-15 08:31:36

标签: bash r

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

#!/path/to/R
...

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

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

另一种选择是将脚本完全保留在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

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

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

12 个答案:

答案 0 :(得分:123)

script.r的内容:

#!/usr/bin/Rscript

cat("Hello")

从命令行调用:

./script.r

答案 1 :(得分:16)

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

答案 2 :(得分:10)

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

#!/usr/bin/env Rscript

答案 3 :(得分:9)

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

我使用R --slave -f script

答案 4 :(得分:6)

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

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

答案 5 :(得分:5)

这有效,

#!/usr/bin/Rscript

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

如果你这样做

#!/usr/bin/env Rscript

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

答案 6 :(得分:4)

只需添加一条注释即可添加到此帖子中。 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可能会对您有所帮助。

答案 7 :(得分: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:~$

答案 8 :(得分: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和其他选项来删除所有启动程序。

答案 9 :(得分:0)

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

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

(目录中的r命令)

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

r -p file.txt

答案 10 :(得分:-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变量的设置方式等。

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

答案 11 :(得分:-1)

您是否知道可以使用浏览器在服务器上使用RStudio?

http://www.rstudio.com/products/rstudio/download-server/