从命令行运行R脚本


Answers:


671

如果要将输出打印到终端,最好使用Rscript

Rscript a.R

请注意,使用R CMD BATCH a.R该方法而不是将输出重定向到标准输出并在终端上显示时,将创建一个名为a.Rout的新文件。

R CMD BATCH a.R
# Check the output
cat a.Rout

使用Rscript时要注意的另一件事是,methods默认情况下它不会加载该程序包,这可能会引起混乱。因此,如果您依赖方法提供的任何内容,则需要在脚本中显式加载它。

如果您确实想使用./a.R调用脚本的方式,则可以#!在脚本顶部添加一个适当的名称

#!/usr/bin/env Rscript
sayHello <- function(){
   print('hello')
}

sayHello()

我还将注意到,如果您在* unix系统上运行,则有一个有用的littler软件包,该软件包可为R提供简单的命令行管道。可能需要使用littler通过脚本运行闪亮的应用程序吗?进一步的细节可以在这个问题中找到。


28
没有#!您的命令行尝试使用解释您命令的同一解释器将其作为命令行脚本运行。即使文件以.R或.r后缀结尾,也不知道它应该是R。#!告诉命令行文件中包含哪种语言。
Spacedman

4
这些年来,我在这里遇到了一些问题,并且能够同时引用littler和Rscript。最主要的是告诉人们,就像您一样,这R CMD BATCH很糟糕。除了那个...
Dirk Eddelbuettel 2015年

@Dason我也在使用R脚本,我正在尝试从Java程序执行R脚本,但看到一些错误。这是我的问题。看看是否可以帮忙。我现在使用您的hello函数示例使其变得简单。
user1950349

有没有办法在命令本身中修改库路径?类似于R CMD INSTALL -l ~/R/lib-dev
mikemtnbikes

@mikemtnbikes我不知道。总是可以添加一些内容来更改脚本中的.libPaths()。但是我看不到Rscript手册页中指出的任何类似选项。
戴森

107

这不能直接回答问题。但是可能有人会在这里结束,因为他们想从终端运行R的oneliner。例如,如果您只想安装一些缺少的软件包并退出,则此oneliner会非常方便。当我突然发现我错过了一些软件包,并且想将它们安装到我想要的地方时,我经常使用它。

  • 要安装到默认位置:

    R -e 'install.packages(c("package1", "package2"))'
  • 要安装到需要root特权的位置:

    R -e 'install.packages(c("package1", "package2"), lib="/usr/local/lib/R/site-library")' 

5
要运行命令,您也可以Rscript -e "getwd()"在终端中使用。Rscript将仅显示命令输出,而不显示完整的R启动消息。
Paul Rougieux 2015年

r -e "cat(getwd(),'\n')"如果安装了Littler,也可以使用。在此答案中, Dirk Eddelbuettel解释了littler和Rscript之间的区别。
Paul Rougieux 2015年

2
感谢您预见到我的问题!我还需要一件事:R -e 'install.packages("package", repos="http://cran.us.r-project.org")'
Erin

4
R -r 'options(warn=2); install...'如果安装失败,应使用此命令停止执行并获得非零的错误代码。否则,任何install.packages错误都只是警告。
rvernica


21

您需要?Rscript命令从终端运行R脚本。

查看http://stat.ethz.ch/R-manual/R-devel/library/utils/html/Rscript.html

## example #! script for a Unix-alike

#! /path/to/Rscript --vanilla --default-packages=utils
args <- commandArgs(TRUE)
res <- try(install.packages(args))
if(inherits(res, "try-error")) q(status=1) else q()

这只是您编写/运行R脚本的一个示例,在文件中添加#!/ path / to / rscript,然后chmod + x <your script.r>和./<your script.r>
Mehul Rathod 2013年

10

如何通过多个命令在带有knitr和rmarkdown的命令中运行Rmd,然后将HTML文件上传到RPubs

这是一个示例:加载两个库并运行R命令

R -e 'library("rmarkdown");library("knitr");rmarkdown::render("NormalDevconJuly.Rmd")'

R -e 'library("markdown");rpubsUpload("normalDev","NormalDevconJuly.html")'

3
请注意,跳过加载库会更简单;R -e 'markdown::rpubsUpload("normalDev","NormalDevconJuly.html")'
gregmacfarlane '16

3

在* Unix系统上使用Rscript的另一种方法是Process Substitution

Rscript <(zcat a.r)
# [1] "hello"

显然,它与接受的答案相同,但这使您可以在不保存命令行功能的情况下操纵和运行文件,例如:

Rscript <(sed s/hello/bye/ a.r)
# [1] "bye"

与此类似,Rscript -e "Rcode"它还允许运行时不保存到文件中。因此,它可以与生成R代码的脚本结合使用,例如:

Rscript <(echo "head(iris,2)")
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1          5.1         3.5          1.4         0.2  setosa
# 2          4.9         3.0          1.4         0.2  setosa

3

仅出于文档目的,有时您需要将脚本运行为sudo

sudo Rscript path/to/your/file.R

2
您什么时候需要这样做?
simplegamer
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.