【问题标题】:Run R script from command line从命令行运行 R 脚本
【发布时间】:2018-10-05 01:55:50
【问题描述】:

我有一个名为 a.r 的文件,它的 chmod 为 755,

sayHello <- function(){
   print('hello')
}

sayHello()

如何通过命令行运行它?

【问题讨论】:

标签: r command-line


【解决方案1】:

这并不能直接回答问题。但是有人可能会在这里结束,因为他们想从终端运行 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")' 
    

【讨论】:

  • 要运行命令,您还可以在终端中使用Rscript -e "getwd()"。 Rscript 只会打印命令输出,而不是完整的 R 启动消息。
  • 正是我想要的。谢谢!
【解决方案2】:

如果您希望输出打印到终端,最好使用 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 通过脚本运行闪亮的应用程序?更多详情请见in this question

【讨论】:

  • 没有#!您的命令行尝试使用与您的命令相同的解释器将其作为命令行脚本运行。它不知道它应该是 R,即使文件以 .R 或 .r 后缀结尾。这 #!告诉命令行文件中包含什么语言。
【解决方案3】:

仅用于文档,有时您需要以sudo 身份运行脚本:

sudo Rscript path/to/your/file.R

【讨论】:

    【解决方案4】:

    从命令行运行 R 脚本的另一种方法是:

    R < scriptName.R --no-save  
    

    --save

    另见What's the best way to use R scripts on the command line (terminal)?

    【讨论】:

      【解决方案5】:

      在 *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
      

      【讨论】:

        【解决方案6】:

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

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

        R -e 'library("rmarkdown");library("knitr");rmarkdown::render("NormalDevconJuly.Rmd")'
        
        R -e 'library("markdown");rpubsUpload("normalDev","NormalDevconJuly.html")'
        

        【讨论】:

        • 请注意,跳过加载库会更简单; R -e 'markdown::rpubsUpload("normalDev","NormalDevconJuly.html")'
        【解决方案7】:

        您需要?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()
        

        【讨论】: