如何在R中自动执行命令?

时间:2012-04-26 06:06:49

标签: r

我有一个非常基本的问题。

我是R的新用户,这些天我使用一个R包进行分析,我必须运行该包的R命令列表以获得所需的输出。 我想创建我的分析管道并自动化它,以便我可以使用一个带有所需参数的单个R命令来完成我的工作。

我们在shell脚本中做的这类工作(我们添加了多个linux命令,awk / sed / perl行

请给我一些关于如何做到这一点的链接,我会很感激。

3 个答案:

答案 0 :(得分:14)

假设这是我的分析管道:我想从正态分布生成10个数字,平均值为MU,标准差为SD,然后用它们做其他事情:

MU <- 1  # the mean
SD <- .5 # standard deviation
NUMBER_TO_GENERATE <- 10

x <- rnorm(NUMBER_TO_GENERATE, mean=MU, sd=SD)
# ... more analysis here.

目前我将这些命令复制粘贴到R终端。 有几种方法可以“自动化”。

1。写一个函数

我将我的命令列表包含在一个大函数中,并将我的参数作为函数参数:

myFunction <- function( MU, SD, NUMBER_TO_GENERATE ) {
    x <- rnorm(NUMBER_TO_GENERATE, mean=MU, sd=SD)
    # ... rest of analysis
}

现在在R中,我可以myFunction(1, .5, 10),减少我必须输入的命令数量。

2。写一个剧本

我可以写一个脚本文件myScript.r。这就像一个bash脚本,除了它是一个R命令列表。

我可以 将我原来的命令列表放在那里,或者我可以将我的函数放在那里以及底部myFunction(1,.5,10)的附加声明。

然后从 R中,我可以这样做:

source('myScript.r')

它将运行脚本中的所有R命令。

3。从shell

如果你想从shell中获取这个脚本,我建议你有一个文件myScript.r,里面有这个函数。

然后查看Rscript(您可以从R中?Rscript)。这是默认安装的R,您可以使用它从unix / windows命令行执行R命令。

例如:

[mathematical.coffee@bar ~]$ Rscript -e '1+1'
[1] 2

特别是,您可以将方法1)和2)与Rscript结合使用,以执行以下操作:

[mathematical.coffee@bar ~]$ Rscript -e 'source("myScript.R"); myFunction( 1, .5, 10 )'

运行你的功能。

或者您当然可以在myFunction(1, .5, 10)中加入myScript.R,在这种情况下,您可以Rscript myScript.R

前者的优点是如果你想做shell脚本(我只提到这个,因为你在你的问题中提到了bash脚本)。在 bash 脚本中,我们可以执行以下操作:

#!/bin/bash
MU=1;
SD=.5;
NUM=10;

Rscript -e "source('myScript.r'); myFunction($MU,$SD,$NUM)"

但是我认为没有将bash脚本与R脚本混合 - 正如我之前提到的,我只提到了这个选项,因为你在你的问题中提到了bash / unix脚本。

答案 1 :(得分:2)

功能可能就是你要找的东西

foo <- function() {
 data <- data.frame(a=1:10, b=10:1)
 plot(data)

  # many more commands here
}

然后你可以调用foo()并运行所有命令。

有关更深入的信息,请参阅R help

您也可能感兴趣source(),请参阅?source

答案 2 :(得分:0)

另一种选择是使用Rscript运行程序。可以使用函数args <- commandArgs(trailingOnly=TRUE)访问命令行中的参数(它们作为列表返回)

e.g。使用上面的math.coffee示例,您的脚本看起来像

输入'contributors()'以获取更多信息和 '引用()'关于如何在出版物中引用R或R包。

args <- commandArgs(trailingOnly=TRUE)
MU <- as.numeric(args[[1]])  # the mean
SD <- as.numeric(args[[2]]) # standard deviation
NUMBER_TO_GENERATE <- as.integer(args[[3]])

rnorm(NUMBER_TO_GENERATE, mean=MU, sd=SD)
doOtherStuff(x)

然后,您可以将您的功能称为Rscript myscript.R 2.0 0.1 100

如果你想用参数做更好的事情(例如--filename),你可以使用optparse库。 http://www.r-bloggers.com/passing-arguments-to-an-r-script-from-command-lines/