Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';在命令行(终端)上使用R脚本的最佳方式是什么?_R_Bash_Command Line_Scripting - Fatal编程技术网

什么';在命令行(终端)上使用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 另一个选项是一个

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

#!/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