什么';在命令行(终端)上使用R脚本的最佳方式是什么?
使用R脚本从命令行进行简单绘图非常方便。但是,从bash脚本运行R一点也不方便。理想可能是这样的什么';在命令行(终端)上使用R脚本的最佳方式是什么?,r,bash,command-line,scripting,R,Bash,Command Line,Scripting,使用R脚本从命令行进行简单绘图非常方便。但是,从bash脚本运行R一点也不方便。理想可能是这样的 #!/path/to/R ... 或 但我都没能做到 另一种选择是将脚本完全保留在R中,例如script.R,并使用R--file=script.R或类似方法调用它。但是,有时脚本将依赖于模糊的命令行开关,在该开关处代码的一部分存在于脚本之外。示例:通过一个本地.Rprofile将东西从bash潜入R,所需的开关就是--vanilla所暗示的一切,除了--no init file 另一个选项是一个
#!/path/to/R
...
或
但我都没能做到
另一种选择是将脚本完全保留在R中,例如script.R
,并使用R--file=script.R
或类似方法调用它。但是,有时脚本将依赖于模糊的命令行开关,在该开关处代码的一部分存在于脚本之外。示例:通过一个本地.Rprofile将东西从bash潜入R,所需的开关就是--vanilla
所暗示的一切,除了--no init file
另一个选项是一个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
#/bin/bash
... # 用于捕获错误输入而不调用R的用法消息
... # 输入的任何bash预处理
... # 等
R--随机标志以下内容适用于我在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变量的设置方式等
不漂亮,但它似乎确实有效 试试看littler
为GNU R提供了hash bang(即以#!/some/path开头的脚本)功能,以及简单的命令行和管道使用。如果用于执行脚本的程序需要参数,可以将它们放在#的末尾!行:
不知道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批处理。您可以将其修改为写入标准输出,但默认为写入.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和其他选项来清除所有启动障碍 #/路径/to/R
不起作用,因为R本身就是一个脚本,所以execve
不满意
我使用R--slave-f脚本script.R的内容:
#/usr/bin/env Rscript
args=commandArgs(trailingOnly=TRUE)
消息(sprintf(“你好%s”,args[1L]))
第一行是。最好使用/usr/bin/env Rscript
而不是硬编码R安装路径。否则,您的脚本可能会在其他计算机上被破坏
接下来,使其可执行(在命令行上):
chmod+x script.r
从命令行调用:
/script.r世界
#你好,世界
如果您对解析R脚本的命令行参数感兴趣,请尝试从版本2.5.x开始与R捆绑的RScript
米格尔·桑切斯的回答是应该的。执行Rscript的另一种方法是使用“env”命令来运行系统范围的Rscript
#!/usr/bin/env Rscript
请尝试使用smallR在命令行中编写quick R脚本:
(r
目录中的命令)
使用smallR从命令行进行打印的方式如下所示:
r -p file.txt
这很有效
#!/usr/bin/Rscript
但是我不知道如果你的机器上安装了超过1个版本的R会发生什么
如果你这样做
#!/usr/bin/env Rscript
它告诉解释器只使用在你的路径上首先出现的任何R。只是一个要添加到这篇文章中的注释。较新版本的R
似乎在某种程度上掩盖了Rscript
。对于2015年1月下载的OSX上的R3.1.2-1,我在
/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
可能会对您有所帮助。不同的R脚本需要不同的参数吗?从命令行向R脚本传递参数怎么样?是的,我认为这是“正式”的方法。从命令行运行Rscript--help
将列出许多可以添加到shebang中的有用选项,例如--vanilla
。我们还要提到commandArgs
函数以及用于解析命令行的getopt
和optpasse
包。因此,在从命令行运行时,参数和选项也可以传递给脚本。请注意,这仅在#时有效/usr/bin/Rscript
(这不是R脚本的标准做法)。这个答案可能会有所帮助,因为不清楚OP指的是哪个平台(*nix或Mac OS)。稍加修改(查看代码格式并删除道歉开头),这将是对此处答案的一个很好的补充。这是使用#的另一个原因/usr/bin/env Rscript
而不是R
脚本中的硬编码路径(并将该长路径添加到$path
)不是“系统范围”,而是env
将允许您运行在自己的$path
中找到的第一个Rscript
,因此,允许用户实际运行系统范围/默认Rscript
(可能未安装在/usr/which
中)以外的其他程序。我建议对R
和Rscript
之类的东西使用env
,因为它们可能不会安装在标准位置。(普通的bash
脚本通常可以安全地始终使用#!/bin/bash
)@michael不,关于bash,你错了,这是da
/sw/Library/Frameworks/R.framework/Versions/3.1/Resources/bin/Rscript
#! /sw/Library/Frameworks/R.framework/Versions/3.1/Resources/bin/Rscript